2009-04-17 13 views
17

¿Puede un doble (de un número dado de bytes, con un equilibrio de mantisa/exponente razonable) mantener con precisión el rango de un entero sin signo de la mitad de ese número de bytes?Representación de números enteros en dobles

E.g. ¿Puede un doble de ocho bytes mantener con precisión el rango de números de un byte de cuatro bytes sin signo?

Lo que se reducirá a esto es si un flotador de dos bytes puede contener el rango de un byte sin signo int.

A un byte unsigned int, por supuesto, ser 0 -> 255.

Respuesta

35

Un IEEE754 64 bits doble puede representar cualquier número entero de 32 bits, simplemente porque tiene los bits 53 y pico disponibles para la precisión y el 32 -bit entero solo necesita, bueno, 32 :-)

Sería verosímil que un número de coma flotante de 64 bits (no doble IEEE754) tenga menos de 32 bits de precisión. Eso permitiría números verdaderamente grandes (debido al exponente) pero a costa de la precisión.

La conclusión es que, siempre que haya más bits de precisión en la mantisa del número de punto flotante que en el entero (y suficientes bits en el exponente para escalarlo), entonces se puede representar sin pérdida de precisión.

-3

No utilizaría las palabras "con toda precisión" al hablar de números de coma flotante. Pero sí, un double puede representar un entero de 32 bits.

No sé qué otras combinaciones de flotantes e ints también es cierto para esto.

Hablando en términos prácticos, no quiere molestarse en usar el punto flotante por encima de lo que su máquina admite, así que simplemente cambie a la aritmética racional con bignums. De esa forma, tienes garantizada la precisión.

+1

Un número de coma flotante puede representar con precisión algunos números, y entre ellos están todos los enteros que se ajustan a su precisión. Una vez que empiezas a hacer una división o una multiplicación que podría causar un desbordamiento, probablemente hayas perdido la precisión. Tampoco todo el mundo tiene un sistema práctico para bignums y/o números racionales. –

6

Sí. Se garantiza que un flotante (o doble) representa exactamente cualquier número entero que no necesita ser truncado. Para un doble, hay 53 bits de precisión, por lo que es más que suficiente para representar exactamente cualquier número entero de 32 bits, y una proporción pequeña (estadísticamente hablando) de 64 bits también.

2

Exactamente qué rango puede representar exactamente depende de muchos factores en su implementación, pero puede reducirlo diciendo que, si el campo exponente se establece en 0, puede representar exactamente números enteros arriba al ancho de su campo de mantisa (asumiendo un bit de signo). Para IEEE 754 de doble precisión, esto significa que puede representar números de 52 bits exactamente. En general, su mantisa tendrá más de la mitad del ancho de la estructura general.

+0

¿No sería posible representar un entero de 53 bits (no de 52 bits) exactamente, con una mantisa de 52 bits, debido al bit implícito a la izquierda del punto binario? – Apriori

Cuestiones relacionadas