Explicando la precisión de coma flotante a los clientes [cerrado]

23

¿Cuál es la mejor manera de explicar el problema de redondeo de punto flotante a los clientes ?

Lo sé

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

así como las entradas en las preguntas frecuentes de C ++ y otras páginas dirigidas a desarrolladores y científicos, pero ¿hay una página web, un artículo o una explicación dirigida a clientes "regulares" con antecedentes matemáticos o científicos limitados? (para lo cual las referencias anteriores caen de plano).

Si se mantuviera o viniera de una institución o corporación bien conocida y reconocida, mucho mejor, dado que, como algunos de ustedes podrían haber experimentado, puede ser un poco complicado explicarlo usted mismo.

Eric Grange
fuente
1
No me molestaría ...
John Shaft
1
Esta es una pregunta realmente fantástica, +10 si pudiera. Un problema frecuente para los desarrolladores.
Cody Gray
2
No es un problema de detalle, responde por qué si agrega lo que se ve en números de precisión de 2 dígitos decimales, termina con un 5.9999999 y no un 6, y por qué debe especificar la precisión de redondeo cuando es "obvio" que el resultado no debería Tiene más de dos dígitos decimales. O por qué a veces 2 menos 2 no siempre es cero, y no parece un tonto al hacerlo.
Eric Grange
99
@Eric Grange: si sus clientes consideran esos problemas de precisión como un error, entonces es un error y debe encontrar una manera de solucionarlo (tal vez al no usar flotador). No les importa de dónde viene este problema de precisión. No les importa cómo funciona su software. Solo quieren que funcione.
David
3
@Eric: El uso de punto flotante es un detalle de implementación. Repito mi pregunta, que pide que no se explique algo en la pregunta, y que evidentemente no he aclarado (disculpas): ¿cuál es el contexto y por qué está discutiendo el uso del punto flotante con un cliente?
Tom Anderson

Respuestas:

8

Encuentro una manera simple de explicar esto es demostrarlo . Discuta cómo dividirlo xpor un número y luego multiplicarlo por el mismo número debería devolverlo xnuevamente; haga que el cliente acepte que este siempre debería ser el caso. Luego haz lo viejo (100 / 3) * 3en una calculadora; demuestre que el valor no regresa, como era de esperar, a 100. Cuando la mayoría de las personas ven que las matemáticas aparentemente simples se "descomponen", entonces tienden a "obtener" el peligro de los números de coma flotante donde la precisión es importante (aunque de forma intuitiva forma, en lugar de al nivel bajo en el que apunta el artículo).

Desafortunadamente, la mayoría de las calculadoras medio decentes (ciertamente todas las científicas que he visto, y más que algunas básicas) hoy en día pueden manejar esto, supongo que están almacenando dígitos adicionales más allá de lo que se puede mostrar y redondear, así que verifique qué tan inteligente es su calculadora antes de hacerlo frente a su cliente.

Scott
fuente
1
Sí, casi todas las calculadoras almacenan al menos 2 dígitos adicionales, por lo que debe agregar algunas multiplicaciones en la mezcla, lo que enturbia la explicación, y el IME les hace pensar que está tratando de engañarlos. La raíz cuadrada requiere menos operaciones, pero la raíz cuadrada ya está fuera del ámbito cotidiano de los clientes habituales.
Eric Grange
2
@Scott Probé algunas calculadoras aquí, ninguna exhibía problemas con (100/3) * 3, incluso (100/3) * 3-100 no exhibía problemas ... Excel también lo hace bien.
Eric Grange
99
Tomemos como ejemplo el dinero, que tiene una precisión limitada perfecta. Explique que divide un dólar, luego cada persona recibe 33 centavos y se pierde un centavo en el redondeo. Cualquiera puede relacionarse con eso.
Inca
44
No te molestes con la calculadora. Divida 1 por 3 en papel, manteniendo tres dígitos significativos.
David Thornley
55
@omegacentauri si crees que la explicación ayuda, supongo que no hablas con los clientes a menudo.
jhocking
5

No creo que haya atajos. Tienes que:

  • Comprenda qué es el punto flotante y cómo se comporta.

O, si eso es demasiado necesario, solo tienes que:

  • Acepte que la computadora no le dará resultados numéricos exactos.

Tal vez un ejemplo con números irracionales ayuda (a pesar de los problemas de punto flotante se aplican a los números racionales también): sqrt(2) ~ 1.414. Entonces 1.414^2 = 1.999396. No importa cuántos dígitos tome, nunca volverá al original 2. Ok, 4 dígitos significativos correctos pueden ser aceptables, pero luego considere lo que sucede cuando se acumula este tipo de "errores de redondeo". Ahí es donde está el verdadero peligro.

Joonas Pulakka
fuente
2
Personalmente lo sé y lo entiendo, pero para algunas personas "punto flotante" ya es un término extraño, por lo que necesita más que una explicación matemática o científica para explicar que lo que pueden calcular en su cabeza, sus costosas computadoras y software tienen problemas para hacerlo bien ;) También la raíz cuadrada está fuera del ámbito cotidiano de los clientes habituales.
Eric Grange
5

Primero, determine de qué se quejan. Las transacciones financieras deben hacerse con precisión, con el número correcto de decimales y las reglas de redondeo correctas. Esto generalmente significa mantener números enteros de unidades monetarias y asegurarse de que la aritmética se haga correctamente.

Alternativamente, pueden estar quejándose de pantallas sobreextraídas, y reducir todo el número de dígitos significativos puede ser todo lo que se necesita.

Para los números en general, siempre puede intentar obtener una x decimal de tres dígitos tal que x * 3 sea 10. Eso muestra los principios básicos.

Hay dos problemas restantes. Una es que ciertos números se pueden expresar exactamente en decimal pero no binario (3.15, por ejemplo). Eso será difícil de explicar a personas no técnicas, y su mejor opción es tratar de evitarlo al no proporcionar suficientes dígitos significativos para que aparezca. El otro es el cliente que sabe un poco, lo suficiente como para saber que la aritmética de la computadora no siempre es exacta y no lo suficiente como para darse cuenta de que la aritmética decimal no siempre es exacta. He discutido con algunos de esos, y no tengo nada útil que informar.

David Thornley
fuente
3

Los números de punto flotante en las computadoras usan binario, así que al igual que tenemos un sistema de números con columnas de uno, decenas, cientos y décimos, centésimos, los números de punto flotante en las computadoras en realidad tienen un, dos, cuatro y mitades, cuartos y octavas columnas. Si el cliente está familiarizado con los pies / pulgadas, recuérdeles cómo usa típicamente fracciones de base 2 de una pulgada para medir.

Ahora intente almacenar 10 centavos como una combinación de mitades, cuartos, octavos de dólar. Simplemente no funciona:

.00011001100110011. . . (se repite infinitamente )

Es lo mismo que tomar una cinta métrica imperial estándar y tratar de medir una décima de pulgada. No puedes hacerlo con precisión. No hay representación de 1/10 como X / Y donde X e Y son números enteros e Y es una potencia de 2.

Es por eso que tenemos los tipos de datos decimales que usan 4 bits para almacenar cada dígito decimal , por lo que volvemos a la representación de base 10. La compensación está en el espacio y el rendimiento (aproximadamente un 100% de rendimiento, por lo que he leído).

Scott Whitlock
fuente
1

Dígales que al igual que su cuenta bancaria no puede contener 4.4423425908459032890413 ... dólares (son $ 4.44 o $ 4.45, nada en el medio), la computadora no puede almacenar fácilmente un número con precisión arbitraria. Las imperfecciones del almacenamiento conducen a imperfecciones de los cálculos.

(Es un poco engañoso, pero debería darles una idea de cuál es el problema).

cuant_dev
fuente
2
Lamentablemente, esa explicación no funciona, ya que el problema de precisión puede suceder al resumir números que tienen solo dos dígitos de precisión para empezar.
Eric Grange
1
Dos dígitos decimales . Sí, estoy de acuerdo, un cliente curioso detectará agujeros en él. Pero luego puede golpearlos con la discusión de la representación binaria: lo pidieron ;-)
quant_dev
Bueno, ya tratando de explicar el punto flotante, IME inmediatamente comienza a pensar que estás tratando de engañarlos, que es algo que podría aliviarse si viniera en términos simples y comprensibles, o de una institución o corporación bien conocida. :)
Eric Grange
1
@Eric Math es difícil, vamos a jugar béisbol: P
quant_dev
1
Pregunte si es más preciso medir algo al 1/10 "más cercano, o al milímetro más cercano. Este último es más preciso, pero los objetos que son múltiplos precisos de 0.1" no serán múltiplos precisos de 1 mm a menos que también sean múltiplo preciso de 5 "(precisamente 127 mm). Agregar el tamaño de dos objetos de 2.54 mm que se miden al 0.1" más cercano producirá un tamaño combinado de 0.2 "; sumando los tamaños redondeados al milímetro más cercano producirá 6 mm aunque el tamaño real debe ser de 5.08 mm.
supercat
1

2/3

Pídales que escriban la respuesta exacta a dos dividida por 3.
Como la respuesta "continúa para siempre", puede señalarlo.

El uso de 1/3 también funcionaría, pero 2/3 es quizás un ejemplo un poco mejor ya que el redondeo le da (por ejemplo) .6666667 mientras que .3333333 parece que simplemente se puede truncar.

Michael Durrant
fuente
0

Al hacer cálculos, las computadoras usualmente usan aproximaciones a números (como en lugar de usar 1000000.7 usan 1000000) porque usar aproximaciones es mucho más rápido. El problema con eso es que cuando haces cálculos con aproximaciones, obtienes aproximaciones. Por lo general, eso funciona bastante bien, pero a veces conduce a resultados inesperados.


fuente
Realmente no entiendo lo que estás diciendo aquí. "¿Porque usar aproximaciones es mucho más rápido"? A veces, la aritmética de enteros es al menos igual de rápida, y eso es preciso. A veces no hay alternativa (como imprimir la raíz cuadrada de 2).
David Thornley
Bueno, intenta explicarle a un experto en marketing por qué las computadoras no pueden representar números irracionales, o básicamente cualquier número en el gran esquema de las cosas (ah, y entonces es posible que quieras darle una conferencia rápida sobre la irracionalidad de \ pi: algo en La serie de Fourier podría ser linda). Aproximada es una palabra que la gente puede entender. Se está acercando a esto desde el punto de vista de alguien que sabe que todos los números no son iguales.
0

Algunos cálculos se realizan de acuerdo con alguna norma legal. Por ejemplo, si desea calcular cuánto impuesto sobre la renta debe pagarse sobre un ingreso anual imponible de € 79.245,18 en Alemania, solo hay una respuesta correcta. Lo haces bien o lo haces mal. Si lo hace bien, no necesita explicar cómo funciona la aritmética de coma flotante. Si se equivoca, no necesita explicar cómo funciona la aritmética de coma flotante, debe corregir su código roto.

A veces, muestra resultados que no se ven bien. Por ejemplo, si convierte US $ 13,297.46 en UK £ con dos dígitos decimales y luego convierte esa cantidad de UK £ a US $, es posible que no obtenga US $ 13,297.46 pero US $ 13,297.45 o US $ 13,297.47. Eso no tiene nada que ver con la aritmética de coma flotante. Es un problema inevitable y es mejor que puedas explicar por qué es inevitable. (También debe saber por qué el problema no ocurre cuando realiza la conversión de UK £ a US $ y viceversa).

Hay otros resultados posibles que no se ven bien. Si convierte números a porcentajes, los porcentajes deberían sumar 100%, pero podrían no serlo. Si muestra cuatro porcentajes con dos decimales, los cuatro porcentajes mostrados podrían sumar 99.99% o 100.01%. Nada que ver con la aritmética de coma flotante. Aún así, deberías poder explicar por qué.

Luego, hay situaciones en las que el uso descuidado de la aritmética de punto flotante conduce a resultados inapropiados. Por ejemplo, a + b + c generalmente no es lo mismo que b + c + a. Si eso causa un problema, no hay nada que explicar, es algo que arregla.

gnasher729
fuente