types - para - punto flotante normalizado
¿Cuál es el primer entero que un flotador IEEE 754 es incapaz de representar exactamente? (2)
Para mayor claridad, si estoy usando un lenguaje que implementa flotadores IEE 754 y declaro:
float f0 = 0.f;
float f1 = 1.f;
... y luego imprimir de nuevo, obtendré 0.0000 y 1.0000 - exactamente.
Pero IEEE 754 no es capaz de representar todos los números a lo largo de la línea real. Cerca de cero, las ''brechas'' son pequeñas; a medida que te alejas, las brechas se agrandan.
Entonces, mi pregunta es: ¿ para un flotador IEEE 754, que es el primer entero (más cercano a cero) que no se puede representar exactamente? Por ahora, solo estoy realmente interesado en las carrozas de 32 bits, aunque me interesaría escuchar la respuesta de 64 bits si alguien se la da.
Pensé que esto sería tan simple como calcular 2 bits_de_mantissa y agregar 1, donde bits_de_mantissa es la cantidad de bits que expone el estándar. Hice esto para flotadores de 32 bits en mi máquina (MSVC ++, Win64), y parecía estar bien, sin embargo.
2 mantisa bits + 1 + 1
El +1 en el exponente (mantisa bits + 1) se debe a que, si la mantisa contiene abcdef...
el número que representa es en realidad 1.abcdef... × 2^e
, lo que proporciona un poco más de precisión implícita.
Para float
, es 16.777.217 (2 24 + 1).
Para el double
, es 9,007,199,254,740,993 (2 53 + 1).
>>> 9007199254740993.0
9007199254740992
El mayor valor representable por un entero de n bits es 2 n -1. Como se señaló anteriormente, un float
tiene 24 bits de precisión en el significado, lo que parece implicar que 2 24 no cabrían.
Sin embargo .
Las potencias de 2 dentro del rango del exponente son exactamente representables como 1.0 × 2 n , por lo que 2 24 pueden caber y, por consiguiente, el primer entero irrepresentable para float
es 2 24 +1. Como se señaló anteriormente. De nuevo.