visual-studio - limpiar - ventana inmediato visual studio 2017
¿Por qué Visual Studio 2008 me dice.9-.8999999999999995=0.00000000000000055511151231257827? (6)
Creo que es porque en el sistema binario, 5 es periódico ya que no es divisible por 2. Y entonces, lo que dijo Mark Rushakoff se aplica.
Cuando escribo esto en la ventana inmediata de Visual Studio 2008:
? .9 - .8999999999999995
Me da esto como la respuesta:
0.00000000000000055511151231257827
La documentación dice que un doble tiene 15-16 dígitos de precisión, pero me está dando un resultado con 32 dígitos de precisión. ¿De dónde viene toda esa precisión extra?
Debería leer: Lo que todo científico informático debería saber sobre la aritmética de coma flotante .
Básicamente se trata de números flotantes almacenados con precisión finita. Tienes que hacer tu comparación con algún delta.
if(.9 - .8999999999999995 <= 0.0001)
//close enough to be equal
La parte "flotante" del "punto flotante" significa que está obteniendo algo más cercano a 5.5511151231257827 * 10 ^ (- 16). No es exactamente como se representa, porque por supuesto todo se hace en binario bajo el capó, pero el punto es que el número está representado por los dígitos significativos, más un número que representa qué tan lejos mover la raíz (punto decimal). Como siempre, wikipedia puede darle más detalles:
(El segundo enlace se enfoca más específicamente en su caso particular).
? .9 - .8999999999999995
Este proceso de resta, con 15-16 dígitos significativos, da
0.0000000000000005
El resto de los dígitos son solo errores de redondeo. Sin embargo, dado que la computadora siempre almacena de 15 a 16 dígitos significativos después del primer dígito distinto de cero, se muestran los errores de redondeo, y se obtienen muchos dígitos aleatorios finales producidos por errores de redondeo. Entonces el resultado tiene 16 dígitos significativos de la operación de resta más 16 dígitos del almacenamiento del resultado, que da 32 dígitos.
Los ceros iniciales no son significativos / parte de la precisión (en lo que se refiere al número de coma flotante , matemáticamente hablando, son significativos). Los ceros iniciales se deben a la parte exponente de la representación interna del número de coma flotante.
La porción 55511151231257827
(que es la significante o mantisa ) tiene 17 dígitos decimales, que es lo suficientemente cerca de 15-16 dígitos.
@Lars D: Lo que usted considera correcto, solo es correcto dentro del contexto de la pregunta. .9 - .8999999999999995
funciona en una carroza con significando 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 resulta ser nuestra mejor aproximación binaria de 0.0000000000000005. Sin embargo, esos ceros a la izquierda todavía no son significativos en lo que se refiere a la representación del número de coma flotante.
Solo hay 15-16 dígitos en la respuesta. Todos esos ceros a la izquierda no cuentan. El número es más como 5.5511151231257827 × 10 -16 . La porción de mantisa tiene 15-16 dígitos. El exponente (-16) sirve para cambiar el punto decimal por 16 lugares, pero no cambia la cantidad de dígitos en el número total.
Editar
Después de recibir algunos comentarios, ahora tengo curiosidad sobre lo que está sucediendo realmente. Conecté el número en cuestión en este convertidor IEEE-754 . Se tomó la libertad de redondear el último "27" en "30", pero no creo que eso cambie los resultados.
El convertidor descompone el número en sus tres partes binarias:
Signo: 0 (positivo)
Exponente: -51
Significand: 1.0100000000000000000000000000000000000000000000000000 (binario para 1.25 10 )
Entonces este número es 1.01 2 × 2 -51 , o 1.25 10 × 2 -51 . Dado que solo se almacenan tres dígitos binarios significativos, eso sugeriría que Lars puede estar en algo. No pueden ser "ruido aleatorio" ya que son iguales cada vez que se convierte el número.
Los datos sugieren que el único dígito almacenado es "5". Los ceros iniciales provienen del exponente y el resto de los dígitos aparentemente aleatorios provienen de la computación 2 -51 .