Visualizador de punto flotante IEEE-754
Mira exactamente cómo se almacena un número decimal en formato IEEE-754 —bit de signo, bits de exponente y bits de mantisa— y por qué números como 0.1 no se guardan de forma exacta.
🔒 Procesado íntegramente en su navegador: nada de lo que ingresa aquí se carga nunca.
Resultado
Todos los números de punto flotante que almacena un ordenador —un número de JavaScript, un float de C, un float de Python— se codifican igual bajo IEEE 754: un bit de signo, un bloque de bits de exponente y un bloque de bits de mantisa (fracción). La precisión simple (32 bits) usa 1 bit de signo, 8 bits de exponente y 23 bits de mantisa; la precisión doble (64 bits), el formato que está detrás del tipo numérico por defecto en casi todos los lenguajes, usa 1 bit de signo, 11 bits de exponente y 52 bits de mantisa. Esta herramienta toma cualquier número decimal que escribas, lo codifica en cualquiera de los dos anchos usando el codificador de punto flotante nativo del navegador mediante DataView/ArrayBuffer —la misma maquinaria sobre la que realmente se ejecuta tu código— y colorea cada bit según la zona a la que pertenece.
La codificación en sí sigue tres pasos, y esta herramienta los recorre todos en lugar de mostrar únicamente los bits finales. Primero, la normalización: el número se reescribe como 1.mantisa × 2^exponente, con exactamente un dígito distinto de cero antes del punto binario (los números demasiado pequeños para ello reciben en su lugar el tratamiento subnormal, sin el 1 implícito a la izquierda). Segundo, el sesgo del exponente: dado que el campo de exponente debe almacenar tanto exponentes positivos como negativos como un número sin signo, se suma un sesgo fijo (127 para precisión simple, 1023 para doble) antes de escribir el campo en binario. Tercero, la mantisa fraccionaria se expande bit a bit con el método clásico de «multiplicar por dos, tomar la parte entera como el siguiente bit y guardar el resto», repitiéndolo hasta llenar el campo de mantisa; en ese punto, los bits sobrantes deciden si el resultado redondea hacia arriba o hacia abajo (redondeo al par más cercano, el valor por defecto de IEEE-754).
Esto es exactamente la razón por la que un número tan común como 0.1 no se almacena de forma exacta. En binario, 0.1 es una fracción periódica (0.0001100110011…, hasta el infinito), de modo que ninguna mantisa finita puede contenerlo con precisión —tiene que ser redondeado en algún momento—. Codifica 0.1 como un float de 32 bits, vuelve a leer los bits y no recuperas 0.1: obtienes exactamente 0.100000001490116119384765625. La precisión doble dispone de 29 bits más de mantisa, por lo que su error de redondeo es mucho menor, pero tampoco es cero: 0.1 como double de 64 bits es exactamente 0.1000000000000000055511151231257827021181583404541015625. Esta herramienta calcula ese valor exacto almacenado con aritmética de enteros grandes (sin atajos de punto flotante), de modo que la diferencia entre lo que escribiste y lo que el hardware realmente conserva nunca queda oculta ni aproximada.
Los valores especiales reciben patrones de bits exactos y reservados en lugar de una codificación normal: el cero y el cero negativo tienen todos los bits de exponente y de mantisa a cero (solo se diferencia el bit de signo), ±Infinito tiene todos los bits de exponente a uno con la mantisa toda a cero, y NaN tiene todos los bits de exponente a uno con al menos un bit de mantisa activado. Todo esto se ejecuta localmente en tu navegador —nada de lo que escribas se sube a ningún sitio— lo que convierte esta página en un lugar seguro para desarrollar una intuición real sobre los errores de punto flotante: por qué `0.1 + 0.2 !== 0.3` en casi todos los lenguajes de programación, por qué las texturas float32 en código gráfico pierden precisión que float64 no perdería, y por qué el código financiero debería generalmente evitar por completo el punto flotante binario.