994 votos

Es matemática de punto flotante roto?

> 0.1 + 0.2 == 0.3
false

> 0.1 + 0.2
0.30000000000000004

Cualquier idea por qué sucede esto?

828voto

Brian R. Bondy Puntos 141769

Todos los de punto flotante de matemáticas es como este y se basa en el estándar IEEE 754. JavaScript utiliza 64-bit de punto flotante de representación, que es el mismo que Java double.

Nunca se debe comparar con == , pero en lugar de comparar el valor absoluto de sus diferencias, y asegúrese de que esta diferencia es menor que el valor de Epsilon, que es un muy, muy pequeño número.

x = 0.2;
y = 0.3;
equal = (Math.abs(x - y) < 0.000001)

Por la razón exacta por la que, por favor, leer Lo que Cada Equipo Científico Debe Saber Sobre la Aritmética de Punto Flotante. Para una más fácil de digerir explicación, ver floating-point-gui.de.

245voto

KernelPanik Puntos 1696

Un Hardware Diseñador de la Perspectiva de

Creo que debería añadir un hardware del diseñador de perspectiva a este ya que el diseño y construcción de hardware de punto flotante. Conocer el origen del error podría ayudar en la comprensión de lo que está sucediendo en el software, y en última instancia, espero que esto ayude a explicar las razones de por qué los errores de punto flotante suceden, y parece que se acumulan con el tiempo.

1. Resumen

Desde una perspectiva de la ingeniería, la mayoría de operaciones de punto flotante tendrá algún elemento de error ya que el hardware que hace los cálculos de punto flotante sólo es necesario tener un error de menos de la mitad de una unidad en el último lugar. Por lo tanto, mucho de hardware va a parar en una precisión que sólo es necesario para el rendimiento de un error de menos de la mitad de una unidad en el último lugar de una sola operación, lo cual es especialmente problemático en la división de punto flotante. Lo que constituye una única operación depende del número de operandos de la unidad de toma. Para la mayoría, es de dos, pero algunas unidades tomar 3 o más operandos. Debido a esto, no hay ninguna garantía de que las operaciones repetidas resultarán en una deseable error ya que los errores se suman a lo largo del tiempo.

2. Normas

La mayoría de los procesadores siguen el estándar IEEE-754 estándar, pero algunos utilizan sin normalizar, o normas diferentes . Por ejemplo, hay un sin normalizar el modo en IEEE-754, que permite la representación de muy pequeños números de punto flotante en la costa de la precisión. La siguiente, sin embargo, va a cubrir el modo normalizado de IEEE-754, que es el típico modo de operación.

En la norma IEEE-754, los diseñadores de hardware están permitidas en cualquier valor de error/epsilon mientras que es menos de la mitad de una unidad en el último lugar, y el resultado sólo tiene que ser menos de la mitad de una unidad en el último lugar para una operación. Esto explica por qué cuando se repiten las operaciones, los errores se suman. Para IEEE-754 de doble precisión, esta es la 54ª poco, ya que el 53 bits se utilizan para representar la parte numérica (normalizado), también llamada la mantisa, del número de punto flotante (por ej. el 5.3 en 5.3e5). Las secciones a continuación en más detalle sobre las causas de error de hardware en las diversas operaciones de punto flotante.

3. Causa del Error de Redondeo en la División

La causa principal de que el error en la división de punto flotante, son la división de algoritmos utilizados para calcular el cociente. La mayoría de los sistemas informáticos de calcular la división mediante la multiplicación por el inverso, principalmente en Z=X/Y, Z = X * (1/Y). La división se calcula de forma iterativa, es decir. cada ciclo se calcula que algunos de los bits del cociente hasta la precisión deseada es alcanzada, que para IEEE-754 es cualquier cosa con un error de menos de una unidad en el último lugar. La tabla de los recíprocos de Y (1/Y) es conocido como el coeficiente de la tabla de selección (QST) en la lenta de la división, y el tamaño en bits del cociente tabla de selección es generalmente el ancho de la base, o el número de bits del cociente calculados en cada iteración, además de algunos de la guardia bits. Para la norma IEEE-754 de doble precisión (64 bits), sería el tamaño de la base de que el divisor, además de algunos de la guardia bits k, donde k>=2. Así, por ejemplo, una típica Coeficiente de Tabla de Selección de un separador que calcula 2 bits del cociente en un momento (base 4) sería 2+2= 4 bits (además de unos cuantos opcional bits).

3.1 División de Error de Redondeo: Aproximación Recíproca

¿Qué son recíprocos en el cociente de la tabla de selección dependen del método de la división: lentitud de la división, tales como SRT, la división rápida, o la división, tales como Goldschmidt división; cada entrada se modifica de acuerdo con el algoritmo de la división, en un intento de producir el menor error posible. En cualquier caso todos los recíprocos son aproximaciones de la real recíproca, y de introducir algún elemento de error. Tanto lento de la división y de rápida división métodos de calcular el cociente de forma iterativa, es decir. algunas número de bits del cociente se calcula cada paso, entonces el resultado se resta del dividendo y el divisor repite los pasos hasta que el error es menor que la mitad de una unidad en el último lugar. Lento de la división de métodos de calcular un número fijo de cifras del cociente en cada paso y son generalmente menos costosas de construir, y la rápida división de los métodos de calcular un número variable de dígitos en cada paso y por lo general son más caros de construir. La parte más importante de la división de métodos es que la mayoría de ellos dependen de la multiplicación repetida por una aproximación de la reciprocidad, por lo que son propensos a error.

4. Errores de redondeo en Otras Operaciones: Truncamiento

Otra de las causas de los errores de redondeo en todas las operaciones de los distintos modos de truncamiento de la respuesta final que IEEE-754 permite. Hay truncado, ronda-a-cero, redonda más cercano (por defecto), ronda y ronda. Todos los métodos de introducir un elemento de error de menos de la mitad de una unidad en el último lugar de una sola operación. A lo largo del tiempo y las repetidas operaciones, el truncamiento también añade de forma acumulativa a la resultante de error. Este error de truncamiento, es especialmente problemático en la exponenciación, que implica una cierta forma de multiplicación repetida.

5. Operaciones Repetitivas

Ya que el hardware que hace los cálculos de punto flotante sólo se necesita para producir un resultado con un error de menos de la mitad de una unidad en el último lugar de una sola operación, el error va a crecer más de la repetición de operaciones en caso de que no se observó. Esta es la razón por la que en los cálculos que requieren de un almacén de error, los matemáticos utilizan métodos tales como el uso de la redonda más cercano incluso dígitos en el último lugar de la IEEE-754, porque con el tiempo, los errores son más propensos a cancelar a la otra, y la Aritmética de Intervalos combinado con las variaciones de la IEEE 754 modos de redondeo para predecir errores de redondeo, y corregirlos. Debido a su bajo nivel de error relativo en comparación con otros modos de redondeo, ronda a la más cercana, incluso dígitos (en el último lugar), es el modo de redondeo predeterminado de IEEE-754.

Tenga en cuenta que el modo de redondeo predeterminado, redonda más cercano incluso dígitos en el último lugar, las garantías de un error de menos de la mitad de una unidad en el último lugar para una operación. Mediante el truncamiento, ronda y ronda solo puede resultar en un error que es mayor que la mitad de una unidad en el último lugar, pero a menos de una unidad en el último lugar, por lo que estos modos no son recomendables a menos que se utilizan en la Aritmética de Intervalos.

6. Resumen

En definitiva, la razón fundamental por la que los errores en operaciones de punto flotante es una combinación de la truncamiento en el hardware, y el truncamiento de la reciprocidad en el caso de la división. Desde la norma IEEE-754 sólo requiere de un error de menos de la mitad de una unidad en el último lugar de una sola operación, los errores de punto flotante por las repetidas operaciones de sumar, a menos que se corrijan.

169voto

Joel Coehoorn Puntos 190579

Al convertir .1 o 1/10 de la base 2 (binario), se obtiene un patrón que se repite después de la coma decimal, como tratando de representar 1/3 en base 10. El valor no es exacto, y por lo tanto no se puede hacer exacto de matemáticas con el uso normal de punto flotante de métodos.

143voto

Devin Jeanpierre Puntos 23162

De punto flotante de errores de redondeo. 0.1 no puede ser representada de forma tan precisa en base 2 como en base-10 debido a la falta de un primer factor de 5. Sólo 1/3 toma un número infinito de dígitos para representar en decimal, pero es "0.1" en la base 3, 0.1 toma un número infinito de dígitos en base-2, donde no en base 10. Y los equipos no tienen una infinita cantidad de memoria.

52voto

Daniel Vassallo Puntos 142049

En adición a las otras respuestas correctas, puede que desee considerar la posibilidad de aumentar sus valores para evitar problemas con la aritmética de punto flotante.

Por ejemplo:

var result = 1.0 + 2.0;     // result === 3.0 returns true

... en lugar de:

var result = 0.1 + 0.2;     // result === 0.3 returns false

La expresión 0.1 + 0.2 === 0.3 devuelve false en JavaScript, pero afortunadamente entero de la aritmética en punto flotante es exacta, por lo que la representación decimal de los errores pueden ser evitados mediante la escala.

Como un ejemplo práctico, para evitar de punto flotante de problemas donde la precisión es de suma importancia, se recomiendade 1 a manejar el dinero como un número entero que representa el número de centavos: 2550 céntimos en lugar de 25.50 de dólares.


1 Douglas Crockford: JavaScript: Las Buenas Partes: Apéndice a - Horrible Partes (página 105).

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X