programar programa mundo lenguaje hola entre diferencias diferencia cuadro comparativo como c++ floating-point standards floating-point-comparison

programa - hola mundo c++



En C++, ¿se garantiza que exactamente uno de<,== y> sea verdadero en flotadores? (1)

En C ++, ¿tengo una garantía de que, para cualquier float a y float b dadas, una y solo una de a < b , a == b y a > b es verdadera?

Si esto difiere entre compiladores y plataformas, estoy interesado en Visual C ++ en x86.


No.

Es suficiente que b sea NaN para que cada uno de a < b , a == b y a > b sea ​​falso.

Si a y b no son NaN, entonces exactamente uno de a < b , a == b o a > b tiene que ser verdadero.

En complemento, esta answer le indica cómo puede obtener un valor de NaN en C ++ (hay varios valores de NaN, que se pueden distinguir al inspeccionar sus representaciones; todas son diferentes entre sí porque NaN nunca es igual a nada) y cómo puede probar si un valor es un NaN (un examen idiomático para ver si una variable x es un NaN es x != x , y de hecho std::isnan() menudo se implementa de esta manera, pero algunos programadores tendrán que leer su código puede ser confundido por ello).

Y luego, si a y b son los resultados de cálculos anteriores, existe el problema del exceso de precisión. Consulte este article para una discusión en C. El estándar C99 resolvió el problema al hacer que las reglas fueran explícitas en las que el exceso de precisión podría y no podría ocurrir, pero a pesar de que C ++ heredó más o menos estas reglas al aplazar el estándar C para la definición de FLT_EVAL_METHOD en cfloat , en la práctica, los compiladores de C se toman las reglas más seriamente que los compiladores de C ++. Por ejemplo, GCC implementa las reglas para C cuando compila con -std=c99 , y en este contexto puede confiar en la propiedad que se mantendrá, pero al momento de escribir esto, GCC no implementa estas reglas cuando se usa como un compilador de C ++.