Pregunta

retornos (int)(33.46639 * 1000000) 33466389

¿Por qué sucede esto?

¿Fue útil?

Solución

coma flotante de matemáticas no es perfecto. Lo que todo programador debe saber al respecto.

  

aritmética de punto flotante se considera un tema esotérico por muchas personas. Esto es bastante sorprendente porque en coma flotante es ubicuo en los sistemas informáticos. Casi todos los idiomas tiene un tipo de datos de coma flotante; computadoras de PC a superordenadores han aceleradores de punto flotante; la mayoría de los compiladores serán llamados para compilar algoritmos de coma flotante de vez en cuando; y prácticamente todos los sistemas operativos debe responder a las excepciones de punto flotante como la de desbordamiento. Este artículo presenta un tutorial sobre aquellos aspectos de coma flotante que tienen un impacto directo sobre los diseñadores de sistemas informáticos. Comienza con el fondo en la representación de punto flotante y errores de redondeo, continúa con una discusión de la norma IEEE de punto flotante, y concluye con numerosos ejemplos de cómo los constructores de computadoras pueden apoyar mejor de coma flotante.

     

...

     

Exprimir infinitamente muchos números reales en un número finito de bits requiere una representación aproximada. Aunque hay un número infinito de números enteros, en la mayoría de los programas de los resultados de los cálculos de enteros se pueden almacenar en 32 bits. Por el contrario, dado cualquier número fijo de bits, la mayoría de los cálculos con números reales producirán cantidades que no se pueden representar con exactitud el uso que muchos bits. Por lo tanto el resultado de un cálculo de punto flotante a menudo debe ser redondeada con el fin de encajar de nuevo en su representación finita. Este error de redondeo es el rasgo característico de cálculo en coma flotante.

Otros consejos

Doble precisión no es exacta, por lo que internamente 33.46639 se almacena realmente tan 33.466389

Edit: Como dijo Richard, está flotando datos de puntos, (almacenado en binario en un conjunto finito de bits) por lo que no es exactamente eso) ....

Era la víspera de Año Nuevo a finales de 1994. Andy Grove, presidente de Intel, venía de un gran año, lo que con el procesador Pentium salir y ser un gran éxito. Por lo tanto, entró en un bar y pidió un trago doble de Johnnie Walker Green Label.

El camarero sirvió para arriba y dijo, "que será $ 20, señor."

Grove puso un billete de veinte dólares en el mostrador, lo miró por un momento, y dijo, "mantener el cambio."

http://en.wikipedia.org/wiki/Pentium_FDIV_bug

La razón es que 33.46639 serán representados como algo poco menos de ese número.

multiplicar por 1000000 le dará 33,466,389.99999999.

Tipo de fundición a presión usando (int) será entonces simplemente volver la parte entera (33466389).

Si desea que el número "correcto", trate redonda () antes de la conversión de tipos.

Si estás preguntando por qué no se convierta en 33466390, es porque doubles no tienen una precisión infinita, y el número no se pueden expresar exactamente en binario.

Si reemplaza el double con un decimal ((int)(33.46639m * 1000000)), sea igual a 33466390, porque decimals se calculan en base 10.

Debido 33.46639 no puede expresarse exactamente en un número finito de dígitos binarios. El resultado real de 33.46639 * 1000000 es 33466389.9999999962747097015380859375. El reparto lo trunca a 33.466.389.

La razón por la que tiene un resultado diferente es el hecho de que utilizó un " Reparto

(int)(33.46639 * 1000000) returns 33466389
^^^^^

para emitir el resultado a un tipo de 'int' ... lo que sea redondeado hacia arriba o hacia abajo el tipo integral cuando multiplicada juntos y luego se convierte en 'int' .... no se basan en coma flotante a ser lo suficientemente precisa Skeet .... registró una excelente introducción en su sitio aquí y aquí ...

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