¿Los números de punto flotante de precisión simple IEEE son iguales a los números de tipo de datos flotantes en lenguaje C? ¿Hay alguna manera de comprobar esto?
¿Los números de punto flotante de precisión simple IEEE son iguales a los números de tipo de datos flotantes en lenguaje C? ¿Hay alguna manera de comprobar esto?
Eso está definido por la implementación.
Un compilador puede compilar un programa utilizando los tipos float
y double
para que siga el comportamiento especificado en IEEE 754, puede desviarse de ese estándar o hacer algo completamente diferente.
Lo que es debería estar documentado en el manual del compilador. Varios compiladores tienen diferentes modos, y pueden favorecer el cumplimiento del estándar sobre velocidad, velocidad sobre cumplimiento, o tratar de encontrar un punto medio sensible.
Por ejemplo, la FPU en la arquitectura x86 está cerca del estándar, pero tiene una serie de diferencias clave, por ejemplo, el formato de datos interno tiene 80 bits de ancho, por lo que para que esta FPU se comporte conforme a los estándares, es necesario redondear cada resultado intermedio a 32 o 64 bits.
Obviamente, eso es lento y proporcionará menos precisión que no redondear, por lo que el comportamiento predeterminado de la mayoría de los compiladores es dejar resultados intermedios en la pila de FPU. Esto suele ser lo que desea, pero si está auditando su programa, el compilador o la implementación del hardware, esa desviación causará una desviación del valor esperado.
En este caso, use /fp:precise
(MSVC), o -fno-fast-math
(GCC, clang) para forzar el cumplimiento estricto. El programa será más lento, pero los resultados son un poco exactos de lo que cabría esperar.
En las plataformas en las que la FPU ni siquiera está cerca del estándar IEEE, pedir matemáticas precisas volverá a escribir el código de punto flotante en operaciones de enteros aplicadas a los miembros de una estructura de datos empaquetada, lo que representa un impacto significativo en el rendimiento.
Es posible que otros compiladores no ofrezcan un modo de cumplimiento estricto, y varias arquitecturas de computación de alto rendimiento tienen una implementación de hardware totalmente conforme, por lo que no se requieren soluciones.
El cumplimiento total de IEEE también limita las optimizaciones que se pueden realizar, ya que las operaciones de reordenación también pueden alterar los resultados, al evitar o provocar flujos excesivos o insuficientes, por lo que incluso en arquitecturas de hardware totalmente compatibles, todavía existe la posibilidad de que un compilador esté no conforme.
Lea otras preguntas en las etiquetas c floating-point standard