2010-04-28 26 views
5

¿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

3

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.

+0

Agradable, aunque el segundo muestra por qué los flotadores serían una buena cosa, si fuera consistente. –

+0

@Michael Sí, lo siento, quería expandirme sobre eso, pero me llamaron. –

+0

mierda sagrada ... Pensé que marqué esto como la respuesta. Lo siento por eso. Solo un año y medio después ... – Rob

0

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.

0

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.

0

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

1

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.

0
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.

Cuestiones relacionadas