También disponible en: English · Português · Français · العربية
Conversor de coma flotante IEEE 754
Mira el signo, el exponente y la mantisa de cualquier número, y el valor decimal exacto que guarda la máquina en vez del redondeado que imprime.
Qué es IEEE 754
IEEE 754 es el estándar que dice cómo guardan los ordenadores los números con decimales. Lo usa casi todo: un número de JavaScript, un número de JSON, una celda de hoja de cálculo, un double de C, un float de una base de datos. La disposición son tres campos en un número fijo de bits —un bit de signo, luego un exponente, luego una fracción— y el valor que codifican es la fracción multiplicada por dos elevado al exponente.
Como el exponente es una potencia de dos, el formato solo puede guardar fracciones cuyo denominador sea una potencia de dos. Un medio, un cuarto, un octavo: exactos. Un décimo: no, igual que un tercio no tiene expansión decimal exacta. Así que el número que escribiste y el que guardó la máquina no suelen ser el mismo, y la diferencia entre ambos es lo que enseña esta página.
La parte que casi ninguna herramienta muestra es el valor exacto. Los programas imprimen los números en coma flotante usando el decimal más corto que se volvería a leer como ese mismo valor, así que 0,1 se imprime como 0,1 y parece correcto. El valor realmente almacenado es 0,1000000000000000055511151231257827021181583404541015625. Eso no es un redondeo del valor guardado: es el valor guardado, escrito entero.
Cómo se usa
- Escribe un número. Lo que pondrías en el código, incluida la notación exponencial como 5e-324. Los botones cubren los casos que enseñan algo interesante.
- Lee los bits. Signo, exponente y fracción van en colores distintos, con el hexadecimal debajo. El panel siguiente dice si el valor es normal, subnormal, cero, infinito o NaN.
- Compara lo que escribiste con lo que se guarda. El valor decimal exacto aparece completo, con una nota que dice si tu número sobrevivió. Cambia a 32 bits para ver el mismo número guardado en la mitad de bits.
Por qué 0,1 + 0,2 no da 0,3
Es el ejemplo con el que todo el mundo se topa primero, y la explicación habitual —la coma flotante es imprecisa— es cierta pero se queda a un paso. Lo interesante es que los tres números ya están mal antes de sumar nada. Guardados como doubles, 0,1 queda algo por encima de un décimo, 0,2 algo por encima de un quinto, y 0,3 algo por debajo de tres décimos. Escribe cada uno en la herramienta de arriba y podrás leer los tres.
Suma los dos primeros y el resultado exacto es 0,3000000000000000444089209850062616169452667236328125. El double más cercano a tres décimos es otro valor, y no es que estén simplemente cerca: son adyacentes. Entre ellos no existe ningún número representable, así que la suma falla por la cantidad más pequeña que el formato puede expresar en esa magnitud, y con eso basta para que la comparación dé falso.
El mismo mecanismo explica el consejo sobre el dinero que seguramente te han dado. No sobrevive nada cuyo denominador lleve un factor de cinco —un décimo, un céntimo, un quinto—, que es toda cantidad monetaria que alguien escriba. También es la razón de que comparar dos números en coma flotante por igualdad sea poco fiable en general, mientras que comparar un medio o un cuarto es perfectamente seguro.
Lo que esto deja a la vista
Los enteros son exactos hasta cierto punto y ahí se acaban. Todo número entero se guarda perfecto hasta dos elevado a cincuenta y tres; el entero siguiente, 9007199254740993, no tiene representación y cae sobre su vecino, así que un programa que maneje identificadores grandes puede fundir dos en silencio. Escríbelo arriba y la herramienta devuelve 9007199254740992. En 32 bits el techo está mucho más abajo: 16777217 ya no cabe, y vuelve como 16777216.
Los valores no están repartidos por igual. El salto entre vecinos se duplica en cada potencia de dos: es de unos dos por diez elevado a menos dieciséis cerca de 1, exactamente 1 en dos elevado a cincuenta y dos, y exactamente 2 justo por encima, que es otra forma de decir que los enteros impares dejan de existir. Entre 1 y 2 hay dos elevado a cincuenta y dos valores distintos; entre 2 y 4 hay los mismos, repartidos por el doble de distancia.
Los números muy pequeños cambian de comportamiento en vez de desaparecer. Por debajo del menor valor normal el formato suelta el 1 inicial implícito y deja que la precisión se degrade poco a poco en lugar de saltar a cero. Son los números subnormales, y el más pequeño es dos elevado a menos 1074, cuyo valor decimal exacto tiene 1076 caracteres, que la herramienta imprime sin problema.
Y hay dos ceros. El cero negativo tiene su propio patrón de bits, se compara igual que el positivo, y aun así se distingue: dividir uno entre él da menos infinito. El panel de bits enseña la diferencia que la comparación esconde.
Cómo se comprobó esto y qué no cubre
Los valores decimales exactos se calculan solo con aritmética entera: no interviene la coma flotante para describir la coma flotante, lo que sería circular. Un valor guardado es un significando entero multiplicado por una potencia de dos, y multiplicar arriba y abajo por la potencia de cinco correspondiente lo convierte en un decimal terminante, así que la expansión siempre es finita y siempre exacta.
Cada patrón de bits y cada valor exacto se comprobó contra la biblioteca estándar de Python sobre más de dos mil números que abarcan todo el rango, incluidos subnormales, los dos ceros, los dos infinitos y los extremos. El módulo decimal de Python da el valor exacto de un double y no una aproximación, lo que lo convierte en un oráculo exacto y no solo independiente.
Lo que no hace: cubre los doubles de 64 bits y los floats de 32, no los formatos de 16 y 128 bits ni las codificaciones decimales que el estándar también define. Muestra el redondeo al más cercano, que es el modo por defecto en todas partes y el único que exponen casi todos los lenguajes. Y no dice nada de las cargas útiles de NaN: un NaN lleva bits que pueden variar entre operaciones, pero nada portable depende de ellos, así que la herramienta solo informa de que el valor no es un número.
Si lo que quieres es la expansión binaria exacta del decimal que escribiste, y no la del valor almacenado, esa es otra pregunta y la responde nuestro conversor de bases: te enseñará un décimo como una fracción binaria que se repite infinitamente. La diferencia entre esa expansión infinita y la finita de aquí es justamente el error de representación.
¿Por qué es gratis?
Es aritmética con enteros, ejecutándose en tu navegador. No hay nada que correr en un servidor, así que no hay nada que cobrar ni cuenta que crear.
Nada de lo que escribes se sube, se guarda ni se registra. La entrada es un número, y no sale nunca de la pestaña.