normalizado - ¿La coma flotante es conmutativa en C++?
punto flotante informatica (3)
El estándar C ++ muy específicamente no garantiza IEEE 754. La biblioteca tiene cierto soporte para IEC 559 (que es básicamente la versión IEC del estándar IEEE 754), por lo que puede verificar si la implementación subyacente usa IEEE 754 / IEC 559 aunque (y cuando lo hace, puede depender de lo que garantiza, por supuesto).
En su mayor parte, las normas C y C ++ suponen que tales operaciones básicas se implementarán, sin embargo, el hardware subyacente funciona. Para algo tan común como IEEE 754, te permitirán detectar si está presente, pero aún así no lo necesitas.
Para valores de coma flotante, ¿se garantiza que a + b == b + a
?
Creo que esto está garantizado en IEEE754, sin embargo, el estándar de C ++ no especifica que se debe usar IEEE754. El único texto relevante parece ser de [expr.add] # 3:
El resultado del operador binario + es la suma de los operandos.
La operación matemática "suma" es conmutativa. Sin embargo, la operación matemática "suma" también es asociativa, mientras que la suma de coma flotante definitivamente no es asociativa. Entonces, me parece que no podemos concluir que la conmutatividad de "suma" en matemáticas significa que esta cita especifica la conmutatividad en C ++.
Ni siquiera es necesario que a + b == a + b
. Una de las subexpresiones puede contener el resultado de la adición con más precisión que la otra, por ejemplo cuando el uso de adiciones múltiples requiere que una de las subexpresiones se almacene temporalmente en la memoria, cuando la otra subexpresión puede mantenerse en un registro ( con mayor precisión).
Si a + b == a + b
no está garantizado, a + b == b + a
no se puede garantizar. Si a + b
no tiene que devolver el mismo valor cada vez, y los valores son diferentes, uno de ellos necesariamente no será igual a una evaluación particular de b + a
.
No, el lenguaje C ++ generalmente no haría tal requisito del hardware. Solo se define la asociatividad de los operadores.
Todo tipo de cosas locas suceden en la aritmética de punto flotante. Tal vez, en alguna máquina, agregar cero a un número denormal produzca cero. Es concebible que una máquina pueda evitar la actualización de la memoria en el caso de agregar un registro de valor cero a un valor negativo en la memoria. Posible que un compilador realmente tonto ponga siempre el LHS en la memoria y el RHS en un registro.
Sin embargo, tenga en cuenta que una máquina con adición no conmutativa necesitaría definir específicamente cómo las expresiones se asignan a las instrucciones, si va a tener control sobre la operación que obtiene. ¿El lado izquierdo entra en el primer operando de la máquina o el segundo?
Dicha especificación ABI, mencionando la construcción de expresiones e instrucciones en el mismo aliento, sería bastante patológica.