Representar números enteros en dobles

3 minutos de lectura

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

Por ejemplo, ¿puede un doble de ocho bytes contener con total precisión el rango de números de un int sin signo de cuatro bytes?

A lo que esto se reducirá es si un flotante de dos bytes puede contener el rango de un int sin signo de un byte.

Por supuesto, un int sin firmar de un byte será 0 -> 255.

avatar de usuario
paxdiablo

Un doble IEEE754 de 64 bits puede representar cualquier número entero de 32 bits, simplemente porque tiene 53 bits.(a) bits disponibles para precisión y el entero de 32 bits solo necesita, bueno, 32 🙂

Sería plausible que un número de punto flotante de 64 bits (no IEEE754 de doble precisión) tuviera menos de 32 bits de precisión. Eso permitiría números realmente 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 coma flotante que en el número entero (y suficientes bits en el exponente para escalarlo), entonces se puede representar sin pérdida de precisión.


(a) Técnicamente, el bit 53 de precisión es implícito 1 al comienzo de la secuencia, por lo que la cantidad de “variabilidad” puede ser solo de 52 bits. Ya sea 52 o 53, aún son suficientes bits para representar cada entero de 32 bits.

  • Parece que en realidad tiene 52 bits de precisión, ¿verdad? Dado que solo existen 52 bits en la sección “fracción” de la estructura: en.wikipedia.org/wiki/Double-precision_floating-point_format

    – BT

    15 de marzo de 2019 a las 22:54

  • @BT, por eso dije “53 y pico”, es decir sobre 53, lo aclararé. Solo hay 52 bits almacenados en la codificación, pero hay un bit implícito de 1 bit al principio. Si lo considera 52 o 53 depende de su punto de vista, pero la conclusión es que hay suficientes bits para representar cualquier valor de 32 bits con bastante facilidad.

    – pax diablo

    16 de marzo de 2019 a las 0:32

avatar de usuario
1800 INFORMACIÓN

Si. Se garantiza que un flotante (o doble) represente exactamente cualquier número entero que no necesite 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 pequeña proporción (estadísticamente hablando) de los de 64 bits también.

Exactamente cuál es el rango que puede representar exactamente depende de muchos factores en su implementación, pero puede limitarlo a la baja diciendo que, si el campo del exponente se establece en 0, puede representar exactamente números enteros hasta el 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.

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

    – A priori

    24 de febrero de 2017 a las 2:39

No usaría las palabras “totalmente preciso” cuando hable de números de punto flotante. Pero si, un double puede representar un entero de 32 bits.

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

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

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad