Representando números enteros en dobles

¿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?

Por ejemplo, ¿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 flotante de dos bytes puede contener el rango de un byte sin signo int.

Un byte sin signo de un byte será, por supuesto, 0 -> 255.

Un doble IEEE754 de 64 bits puede representar cualquier entero de 32 bits, simplemente porque tiene 53 bits impares disponibles para la precisión y el entero de 32 bits 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.

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.

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 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.

Para obtener más detalles sobre cómo funciona un doble, es posible que desee consultar esta publicación de blog: Anatomía de un número de coma flotante .

No usaría las palabras “con toda precisión” cuando se habla de números de coma flotante. Pero sí, un double puede representar un entero de 32 bits.

No sé a qué otras combinaciones de flotadores y puntos se aplica también.

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.