arithmetic - floating point error
¿Por qué el valor de este flotador cambia de lo que se estableció? (5)
¿Por qué este programa C da el resultado "incorrecto"?
#include<stdio.h>
void main()
{
float f = 12345.054321;
printf("%f", f);
getch();
}
Salida:
12345.054688
Pero la salida debería ser, 12345.054321
.
Estoy usando VC ++ en VS2008.
Da la respuesta "incorrecta" simplemente porque no todos los valores reales son representables por flotantes (o dobles, para el caso). Lo que obtendrá es una aproximación basada en la codificación subyacente.
Para representar cada valor real, incluso entre 1.0x10 -100 y 1.1x10 -100 (un rango realmente minúsculo), aún necesita un número infinito de bits.
Los valores de IEEE754 de precisión única solo tienen 32 bits disponibles (algunos de los cuales están asignados a otras funciones, como el exponente y las representaciones NaN / Inf) y, por lo tanto, no pueden ofrecer una precisión infinita. En realidad, tienen 23 bits disponibles, lo que da una precisión de aproximadamente 2 24 (hay un bit implícito adicional) o algo más de 7 dígitos decimales (log 10 (2 24 ) es aproximadamente 7,2).
Adjunto la palabra "incorrecto" entre comillas porque no es realmente incorrecta. Lo que está mal es su comprensión acerca de cómo las computadoras representan los números (no se ofenda, no está solo en este malentendido).
Dirígete a http://www.h-schmidt.net/FloatApplet/IEEE754.html y escribe tu número en el cuadro "Representación decimal" para ver esto en acción.
Si desea un número más preciso, use dobles en lugar de flotantes; estos tienen el doble de bits disponibles para representar valores (suponiendo que su implementación C usa tipos de datos de precisión simple y doble IEEE754 para flotación y doble, respectivamente).
Si desea una precisión arbitraria, necesitará usar una biblioteca "bignum" como GMP, aunque eso es algo más lento que los tipos nativos, así que asegúrese de entender las compensaciones.
El número decimal 12345.054321 no se puede representar con precisión como un float
en su plataforma. El resultado que está viendo es una aproximación decimal al número más cercano que se puede representar como un float
.
Los valores de punto flotante de precisión simple solo pueden representar de ocho a nueve dígitos significativos (decimales). Más allá de ese punto, estás viendo un error de cuantificación.
Todo tiene que ver con la precisión. Su número no se puede almacenar con precisión en un flotador.
float
son sobre conveniencia y velocidad, y usan una representación binaria: si le importa la precisión, use un tipo de decimal.
Para comprender el problema, lea Lo que todo científico informático debería saber sobre la aritmética de punto flotante : http://docs.sun.com/source/806-3568/ncg_goldberg.html
Para obtener una solución, consulte las Preguntas frecuentes sobre Aritmética decimal : http://speleotrove.com/decimal/decifaq.html