¿Hay algún ejemplo de una empresa que se quemó por datos de coma flotante que causó un problema de redondeo? Estamos implementando un nuevo sistema y todos los valores monetarios se almacenan en flotadores. Creo que si puedo mostrar ejemplos reales de por qué esto ha fallado, tendrá más peso que la teoría de por qué los valores no pueden almacenarse correctamente.Ejemplo de vida real para Error de punto flotante
Respuesta
Estos examples son del mundo integrado (Ariane 5, Patriot) pero no son errores de redondeo de coma flotante stricto sensu. El error Ariane 5 es un error en una conversión. El error Patriot se introdujo durante las adaptaciones del software. Implica cálculos en diferentes precisiones con una constante intrínsecamente irrepresentable (que resulta ser el aspecto inocuo 0.10).
Hay dos problemas que preveo con flotadores binarios para los valores monetarios:
valores decimales tan común como 0,10 no se puede representar con exactitud.
Si la precisión es demasiado pequeña, lo que podría haber sido un desbordamiento limpio al generar una excepción se convierte en una pérdida de precisión difícil de seguir.
en cuenta que los formatos de punto flotante de base 10 están estandarizados precisamente por los valores monetarios: algunas monedas valen 1/1000000 de un dólar, no se intercambian en menos de miles de personas, y la cantidad máxima que puede querer poder representar es proporcionalmente grande, por lo que una representación escalable tiene sentido. La intención es que la mantisa sea lo suficientemente grande para las sumas más grandes con la resolución oficial.
Trabajé en un sistema que calculaba los aumentos salariales y las bonificaciones de las personas. Los cálculos fueron relativamente complejo debido al número de partes (rendimiento de la empresa, el rendimiento departamento, el rendimiento personal), pero cada parte era bastante simple (porcentajes generalmente compuestas) algo como:
personal_bonus = sueldo * personal_bonus_percentage
department_bonus = personal_bonus * 50%
company_bonus = personal_bonus * 110%
total_bonus = personal_bonus + department_bonus + company_bonus
Donde personal_bonus_percentage fue un valor calculado en función del tamaño del bote de bonificación, la calificación de la persona y las personas con esa calificación.
Cuando probamos no calculamos manualmente (es decir, en papel) cuáles deberían haber sido los resultados, sino que los comparamos con Excel con la misma fórmula. Los empleados hicieron los cálculos en papel y cuando reescribimos el algoritmo para contrarrestar el problema del punto flotante, aproximadamente el 5% de los premios estaban equivocados.
No creo que encuentres a nadie que realmente se haya quemado. He oído hablar de empresas en las que los programas de nómina o de intereses utilizaban el punto flotante en lugar del decimal fijo y el programador recogía los bits fraccionarios de todas las cuentas para malversar sin que los titulares de la cuenta activaran la alarma. Pero ese tipo de cosas solía arreglarse silenciosamente hace años. Ahora hay reglas de mejores prácticas para evitar ese tipo de cosas.
La otra forma en que el error puede ser lo suficientemente grande como para hacerte tropezar es si tratas de extrapolar a partir de una muestra pequeña. Como tomar una encuesta en un pueblo pequeño e intentar predecir los resultados populares para todo el país.
Estaba trabajando en un proyecto el otro mes en el que estábamos usando la matriz matemática para calcular polinomios para una curva de calibración. Los coeficientes de nuestro programa fueron radicalmente diferentes de los que se hicieron en una hoja de cálculo. Cuando revisé tanto el programa como la hoja de cálculo y redondeé todo al número correcto de dígitos significativos, estuvieron de acuerdo bastante bien. Cuando la basura se estaba multiplicando por basura, y luego cuadrada o en cubos, entonces se convirtió en un problema.
El único error real de FPU que puedo pensar es una comparación de igualdad en flotadores. Por ejemplo, 0.123456 y 0.123457 están muy cerca; de hecho, podrían ser iguales si ambos son el resultado de una serie de cálculos en los que podrían acumularse errores de redondeo. En lugar de comparar con ==, debe crear un par difuso que determine si están suficientemente cerca como para considerarse iguales.
Una búsqueda rápida de Google da vuelta a esta página, que entra en gran longitud sobre las advertencias asociadas con respecto a una función de igual difusa. http://adtmag.com/articles/2000/03/16/comparing-floats-how-to-determine-if-floating-quantities-are-close-enough-once-a-tolerance-has-been.aspx
trabajé en un equipo que creó una FPU (diseño de hardware) que pasó testfloat el nivel 3 de precisión simple, doble, y extendida. Hay muchos virus malos por ahí, la mayoría parchados en el software si pueden captar la instrucción o excepción, ese tipo de cosas. Creo que el tipo testfloat dijo que los errores principales de fpu están en el int para flotar y flotar a las conversiones int, recuerdo que el pentium 4 falló por esa razón. Sin embargo, el pentium III ya había pasado testfloat. No lo he probado desde hace tiempo, no sé cuál es el estado de estos procesadores multinúcleo. No se deje engañar por pensar que el pentium Yo era el único con errores, casi todos, sin duda las empresas más grandes nombradas, tienen errores fpu. IEEE 754 es un estándar horrible, conseguir un fpu para cumplir con ese estándar es muy difícil y muy caro, después de esa experiencia, evito las matemáticas de coma flotante tanto como sea posible. compiladores y bibliotecas c (atof, ftoa, strtod, printf, etc.) son parte del problema, no solo el hardware.
flotador de precisión simple tiene solo 23 bits de mantisa, usted comenzará a tirar centavos o dólares o miles de dólares a menudo. Con o sin redondeo. El redondeo debería promediarse si los datos son lo suficientemente aleatorios como para ganar un centavo aquí, perder un centavo allí. Si los artículos que se están rastreando tienen siempre un tamaño fijo o un número limitado de unidades. digamos widgets a 9.99 o dos para 15.99, entonces la aleatoriedad se va y el redondeo, así como la mantisa le costará a alguien con precisión, ya sea la empresa o los clientes.
Seguramente hay muchos números entre 0,00 y 0,99 que no se pueden representar, si se trata de cantidades pequeñas, se redondeará más pronto que tarde.
Usar flotadores por dinero es solo una mala idea, ¿quizás estás buscando munición para cambiar eso?
Teníamos un controlador de motor que era manejado por un software que usaba un solo fpu de precisión, había una sección del algoritmo de control que las constantes tenían que sumar 1.0, yo no conocía esta regla, simplemente dejé una C programa calcular las constantes. Tuvimos que ajustar el lsbit de la mantisa en una de las constantes a mano para que el controlador del motor se estabilizara.
double: 1.000167890
single: 1.000167847
(b*(b-1)) - (b*b-b): 0.0000000281725079
(a*(a-1)) - (a*a-a): 0.0000000000000001
resultSmall - result: 0.000000028172507807931691
double^12 - single^12:0.000000593091349143648472
Recuerdo que los errores o las excentricidades - - solía existir en superordenadores diseñados por Seymour Cray. Sus multiplicadores solo verificaban los primeros doce bits para cero, mientras que el sumador buscaba 13, dejando atrás un pequeño porcentaje de números que podían ser cero a uno, pero tenían un número válido para el otro.
Uno de los estudiantes de William Kahan estaba haciendo una simulación de turbulencia de aire para rotores de helicóptero utilizando 360 de IBM cuando salió por primera vez con su inusual formato fp de 32 bits.a - b
no se calculó exactamente, incluso si los dos números estaban dentro de un factor de dos entre sí, causando un problema creciente de pérdida de precisión con cada cálculo. En consecuencia, la computadora estaba dando resultados incorrectos.
Kahan hizo que su estudiante reescribiera su código usando dobles, lo que producía puntos de pérdida correctos.
- 1. Contravalor de Scala: ejemplo de vida real
- 2. Vida real, ejemplo práctico de utilizar String.intern() en Java?
- 3. Ejemplos de vida real de metodologías y ciclos de vida
- 4. Límites de punto flotante
- 5. ¿Por qué usa un punto flotante en este ejemplo?
- 6. ReRegisterForFinalize SuppressFinalize ejemplo real
- 7. Formato de punto flotante Sphinx
- 8. Conversión de punto flotante a punto fijo
- 9. Codificación de punto flotante crudo
- 10. Comparación de punto flotante irreproducibilidad
- 11. Estructuras: ejemplos de la vida real?
- 12. comparación de punto flotante de asignación constante
- 13. ¿Cómo crear robots de la vida real?
- 14. Tratando con excepciones de punto flotante
- 15. ZODB en la vida real
- 16. ¿Un buen ejemplo de programación de la vida real sencilla y pequeña en Haskell?
- 17. Usos de .sub() en la vida real
- 18. División de guión y de punto flotante
- 19. "Medio redondeado" en valores de punto flotante
- 20. Lenguajes funcionales: ejemplos de la vida real
- 21. Comprensión de los problemas de punto flotante
- 22. Punto flotante o punto fijo para aplicaciones Android NDK OpenGL?
- 23. Punto flotante determinista y .NET
- 24. Formato del número de punto flotante
- 25. precisión de punto flotante en Visual C++
- 26. Signo de un número de punto flotante
- 27. Número de dígitos significativos para un tipo de punto flotante
- 28. Problemas de comparación de punto flotante MySQL
- 29. ¿Cuál es el siguiente número de punto flotante normalizado después de (antes) un número de punto flotante normalizado f?
- 30. SQL establece la precisión de punto flotante
Agradable, aunque el segundo muestra por qué los flotadores serían una buena cosa, si fuera consistente. –
@Michael Sí, lo siento, quería expandirme sobre eso, pero me llamaron. –
mierda sagrada ... Pensé que marqué esto como la respuesta. Lo siento por eso. Solo un año y medio después ... – Rob