2010-05-11 8 views

Respuesta

10

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 (una gama verdaderamente minúscula), que todavía requieren 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 representaciones de exponente y NaN/Inf) y, por lo tanto, no pueden ofrecer una precisión infinita. En realidad tienen 23 bits disponibles que dan una precisión de aproximadamente 2 (hay un bit implícito adicional) o poco más de 7 dígitos decimales (log (2) es aproximadamente 7,2).

Adjunto la palabra "incorrecta" entre comillas porque no es en realidad mal. 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íjase a http://www.h-schmidt.net/FloatApplet/IEEE754.html y escriba su 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 utiliza 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.

2

El número decimal 12345.054321 no se puede representar con precisión como 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 float.

+0

sabía que esto sucedió en el caso de C#. Pero nunca se supo en el caso de C. – anonymous

+0

El "flotador" de C también tiene un tipo de precisión fijo, por lo que no hay diferencia con C#. –

0

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.

0

Todo tiene que ver con la precisión. Su número no se puede almacenar con precisión en un flotador.

+0

Verdadero y falso: el número del OP no se puede almacenar con precisión, pero los flotadores pueden almacenar números de alta precisión exactamente, solo tienen que ser representables exactamente en binario (por ejemplo, 1/65536). –

+2

@Matt, eso en realidad no fue un reclamo hecho por zaf, quien declaró: _Tu número_ no puede ... – paxdiablo

+0

Correcto, votando. Solo estaba dejando en claro que la precisión en sí misma no es un problema con los flotadores. –

Cuestiones relacionadas