¿Por qué Visual Studio 2008 dime 0,9-,8999999999999995 = 0.00000000000000055511151231257827?

StackOverflow https://stackoverflow.com/questions/1662600

Pregunta

Cuando escribo esto en Visual Studio 2008 ventana inmediata:

? .9 - .8999999999999995

Me da esto como la respuesta:

0.00000000000000055511151231257827

La documentación dice que un matrimonio tiene 15-16 dígitos de precisión, pero me está dando un resultado de 32 dígitos de precisión. ¿Dónde está toda esa precisión adicional viene?

¿Fue útil?

Solución

son sólo 15-16 dígitos en la respuesta. Todos los ceros a la izquierda no cuentan. El número es en realidad más como 5.5511151231257827 × 10 -16 . La parte de mantisa tiene 15-16 dígitos en ella. El exponente (-16) sirve para desplazar el punto decimal más por 16 lugares, pero no cambia el número de dígitos en el número total.

Editar

Después de conseguir algunos comentarios, ahora tengo curiosidad acerca de lo que realmente está pasando. He conectado el número en cuestión en este IEEE-754 Convertidor . Se tomó la libertad de redondear la última "27" en "30", pero no creo que eso cambie los resultados.

El convertidor se desglosa el número en sus tres partes binarias:

Señal: 0 gratis (positivo) Exponente: -51
Significand: 1.0100000000000000000000000000000000000000000000000000 (binario para 1.25 10 )

Así que este número es 1.01 2 × 2 -51 , o 1,25 10 × 2 -51 . Dado que sólo hay tres dígitos binarios significativas siendo almacenados, eso sugeriría que Lars puede ser en algo. No pueden ser "ruido aleatorio", ya que son los mismos cada vez que el número se convierte.

Los datos sugieren que la única dígitos almacenado es "5". Los ceros iniciales provienen del exponente y el resto de los dígitos aparentemente aleatorias son de computación 2 -51 .

Otros consejos

Debe leer: Lo que todo científico debe ordenador Saber sobre la aritmética de punto flotante .

Básicamente se trata de números de punto flotante de ser almacenado con precisión finita. Usted tiene que hacer su comparación con un poco de delta.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

Los ceros iniciales no son significativas / parte de la precisión (por lo que el número de coma flotante se refiere - Matemáticamente hablando, que son significativa). Los ceros iniciales se deben a la parte del exponente de la representación interna del número de coma flotante.

La porción 55511151231257827 (que es el significand o mantisa ) tiene 17 dígitos decimales, que es lo suficientemente cerca de 15-16 dígitos.

@Lars D: ¿Cuál considera usted que es correcto, sólo es correcto dentro del contexto de la cuestión. .9 - .8999999999999995 funciona a un flotador con significand 0.625 y exponente de -50. Tomando 0,625 * 2 -50 resultados en 5.5511151231257827e-16. Ahora, fuera del contexto de la pregunta original, tenemos un número con 17 dígitos significativos que no pasar a ser nuestra mejor aproximación binaria de ,0000000000000005. Sin embargo, los ceros a la izquierda todavía no son significativos en lo que respecta a la representación del número en coma flotante.

  

? 0,9-0,8999999999999995

Este proceso de sustracción, con 15-16 dígitos significativos, da

  

,0000000000000005

El resto de los dígitos son simplemente errores de redondeo. Sin embargo, ya que el ordenador siempre almacena 15-16 dígitos significativos después del primer dígito distinto de cero, se muestran los errores de redondeo, y se obtiene una gran cantidad de dígitos al azar de salida producidos por errores de redondeo. Así, el resultado tiene 16 dígitos significativos de la operación de resta más 16 dígitos desde el almacenamiento del resultado, lo que da 32 dígitos.

El "flotante" parte de "punto flotante" significa que vas a encontrar algo más cercano a 5.5511151231257827 * 10 ^ (- 16). Eso no es exactamente cómo se representa, porque, por supuesto, todo se hace en binario bajo el capó, pero el punto es, el número está representado por los dígitos significativos, además de un número que representa la distancia para mover el radix (punto decimal). Como siempre, Wikipedia le puede dar más detalles:

(El segundo enlace se centra más específicamente en su caso particular.)

Creo que es debido a que en el sistema binario, 5 es periódica, ya que no es divisible por 2. Y luego lo que Mark Rushakoff dijo aplica.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top