Considerar:
double f = foo(); double g = -f; donde foo() puede devolver cualquier cosa que se asigne a f .
es double g = -f; seguro en C y C++? Para los tipos IEEE 754, obviamente lo es, pero C y C ++ no restringen la implementación de punto flotante a eso (a diferencia de Java).
Si es seguro, entonces -g siempre compararía true con foo() ?
(Lo anterior no es cierto para int en complemento a 2).
Los tipos flotantes están definidos por §5.2.4.2.2 del estándar C (borrador N1570 al menos):
Las características de los tipos flotantes se definen en términos de un modelo que describe una representación de números y valores de punto flotante que proporcionan información sobre la aritmética de punto flotante de una implementación.21) Los siguientes parámetros se utilizan para definir el modelo para cada punto flotante tipo:
- signo
s(±1)bbase o raíz de representación exponencial (un entero > 1)eexponente (un número entero entre un mínimo emin y un máximo emax)- precisión
p(el número de dígitos de base b en la significancia)fkenteros no negativos menores que b (los dígitos significativos)Un número de coma flotante (x) se define mediante el siguiente modelo:
Entonces, sí, esa expresión es algo segura , excepto en el caso en que foo devuelva uno de los "otros tipos de números de coma flotante" no especificados por el estándar:
Además de los números de punto flotante normalizados (f1 > 0 si x ≠ 0), los tipos flotantes pueden contener otros tipos de números de punto flotante, como números de punto flotante subnormales (x ≠ 0, e = emin , f1 = 0) y números de punto flotante no normalizados (x ≠ 0, e > emin, f1 = 0), y valores que no son números de punto flotante, como infinitos y NaN.
y:
Una implementación puede dar un signo a cero y valores que no son números de punto flotante (como infinitos y NaN) o puede dejarlos sin firmar.
Probablemente haya otras advertencias para esto, pero el estándar incluye bastantes detalles sobre las características de estos tipos. Puede leer todo sobre ellos en este borrador disponible públicamente .