2011-04-25 7 views
23

Me gustaría formular una pregunta que sigue a this one, que se responde bastante bien mediante la comprobación de definir si el compilador usa el estándar. Sin embargo, esto solo funciona para C. ¿Hay alguna manera de hacer lo mismo en C++?Cómo comprobar si el compilador de C++ utiliza el estándar de punto flotante IEEE 754

No deseo convertir los tipos de coma flotante a texto o usar algunas funciones de conversión bastante complejas. Solo necesito el control del compilador. Si conoce una lista de dichos compiladores compatibles, publique el enlace. No pude encontrarlo.

+5

en tiempo de ejecución puede usar 'std :: numeric_limits :: is_iec559()' para verificar si un tipo de coma flotante particular está representado según IEEE 754. Por supuesto, eso dice poco sobre si el manejo del punto flotante del compilador es 754 , pero debería darte una buena pista. –

+0

Creo que es menos una cuestión de que el compilador lo soporte y más una cuestión de la FPU de la CPU que lo soporta ... pero no estoy 100% seguro de esto, así que estoy haciendo un comentario y no una respuesta. –

+0

@AlexanderGessler ¿En tiempo de ejecución? ¿Estás seguro? http://en.cppreference.com/w/cpp/types/numeric_limits/is_iec559 – cubuspl42

Respuesta

24

Actualmente, usted tiene una manera más fácil de lograr esto en C++. Del estándar C++ 18.2.1.1 existe la clase numeric_limits dentro de std. Con el fin de acceder a dicho miembro estático sólo tiene que hacer esto:

std::numeric_limits<double>::is_iec559; 

O:

std::numeric_limits<float>::is_iec559; 

que debe devolver true si IEEE 754 está en uso, en caso contrario.

Como un método alternativo, la segunda parte de Adam's answer debería hacerlo también para C++.

+3

En la práctica esto no es del todo confiable, sin embargo. Llámelo no conforme si lo desea, pero los compiladores no necesariamente * saben * si sus tipos de punto flotante son IEEE754, ya que producen código de máquina que se ejecuta en múltiples variantes de una arquitectura, algunas de las cuales se ajustan a cada detalle de ulp. -precisión y utilizando el modo de redondeo correcto, mientras que otros no lo hacen. –

+1

@Steve a fair point. No sé de ninguna otra forma razonablemente estándar/razonable de probar esto, desafortunadamente, que no sea averiguar en qué arquitectura se encuentra y agregar cheques basados ​​en si se sabe que la familia de chips en la que se está ejecutando se está conformando por completo. –

+1

Creo que está bien para el propósito, parece que a todos los que preguntan realmente les importa el formato, no la conformidad con el conjunto de IEC559. Puede obtener un falso negativo de un compilador que conservadoramente dice que no implementa IEC559, cuando hace lo suficiente para nuestros propósitos. Solo vale la pena tener en cuenta que esto es realmente algo difícil de tratar para los compiladores, así que estén atentos a la rareza. –

Cuestiones relacionadas