¿Por qué es importante la exactitud del módulo de coma flotante?

9

La mayoría de los dialectos de Smalltalk implementan actualmente un módulo flotante inexacto ingenuo (fmod / resto).
Acabo de cambiar esto para mejorar Squeak / Pharo y, finalmente, otra adhesión de Smalltalk a los estándares (IEEE 754, ISO / IEC 10967), como ya lo hice para otras operaciones de coma flotante de última generación.

Sin embargo, para la adopción de esos cambios, anticipo que cumplir con el estándar no será suficiente para convencer a mis compañeros, por lo que explicar en qué circunstancias realmente importaría esta exactitud me ayudaría mucho. No pude encontrar un buen ejemplo por mí mismo hasta ahora.

¿Alguien aquí sabe por qué / cuándo / dónde (IOW en qué algoritmo) importaría tal exactitud de módulo?

aka.nice
fuente
Yo creo que es posible obtener mejores respuestas en Ciencias de la Computación , ya que tales cuestiones son más importantes en su dominio (sub). En cualquier caso, la pregunta es onópica aquí y debe dar a nuestros respondedores unos días antes de volver a publicar.
Raphael
1
He visto código que depende de la exactitud de fmod / modf que me hizo estremecer, pero la posibilidad de que un lenguaje se atreva a implementar un módulo de coma flotante inexacto ingenuo parece aún más aterrador. Código de ejemplo: (1) Tome el resto. (2) Pare si es cero. (3) Multiplica por 2 y ve a (1). Uno puede hacer un trabajo útil durante este proceso, pero el punto crucial es que la terminación de este proceso se basa en la exactitud del resto y la exactitud de la multiplicación por 2. No estoy seguro de si debería dar una respuesta más completa aquí, porque la Ciencia Computacional parece más apropiada para esta pregunta
Thomas Klimpel
Una suposición: normalizar la entrada de una función trigonométrica.
Paul A. Clayton
@ThomasKlimpel Estoy interesado si encuentra referencias. Tenga en cuenta que el resto ingenuo se define como (x - ((y / x) truncado * x)) con IEEE redondeado a operaciones pares más cercanas, podemos demostrar que exactoRem (x, y) == 0 => naiveRem (x, y) == 0. El problema es todo lo contrario: falsa división exacta positiva, como naiveRem (4.0,0.1) == 0.0 que desafortunadamente se ajusta a las expectativas ingenuas en muchos casos.
aka.nice
@ PaulA.Clayton sí, para seno en grados tal vez ... Sin embargo, supongo que el rem ingenuo funciona igual de bien que el rem exacto hasta aprox. 1e16 grados porque 360 ​​solo tiene un rango de 6 bits establecido, y porque la división por 360 parece nunca redondearse para predecesores de múltiplos de 360 ​​... Para radianes, una biblioteca decente requiere precisión múltiple, hace un rem exacto limitado a doble precisión realmente ayuda en tal caso?
aka.nice

Respuestas:

1

Tenga en cuenta que la implementación inexacta de coma flotante afecta el clima.

Se han realizado pruebas ejecutando predicciones meteorológicas con las mismas entradas en hardware diferente y las predicciones divergieron. Si está ejecutando un algoritmo iterativo, entonces una pequeña diferencia de redondeo aquí o allá puede resultar en un efecto mariposa que cambia la luz del sol a lluvia.

Las reglas de redondeo en los estándares (IEEE 754, ISO / IEC 10967) se han pensado cuidadosamente para que los algoritmos numéricos se comporten de manera predecible con la mayor precisión y reproduzcan el mismo resultado cada vez. Al no seguir los algoritmos numéricos estándar diseñados para esas reglas de redondeo se romperán y los algoritmos iterativos como las predicciones meteorológicas pueden incluso dar un resultado aleatorio.

(¿y eso no dice algo sobre las predicciones meteorológicas? :)

Goswin von Brederlow
fuente
1
Por otro lado, si el efecto mariposa cambia la luz del sol a lluvia, sus resultados no fueron útiles de todos modos.
gnasher729
Érase una vez, guardé datos flotantes en ASCII con dígitos insuficientes. Un cliente quería mostrarme un problema, pero después de restaurar los datos del archivo ASCII, el problema desapareció. Dije que no debería importarle un poco, si su problema estaba mal condicionado, no hay nada que pueda hacer de todos modos. Dijo que era su negocio, el mío era proporcionar software que permitiera la reproducibilidad de sus propios problemas. Él estaba en lo correcto.
aka.nice
Es por eso que debe generar números de coma flotante para guardar como hexadecimales usando% a.
Goswin von Brederlow