Cómo se guardan los números decimales: el estándar IEEE 754
Signo, exponente y mantisa explicados con un ejemplo completo, y la razón de los famosos errores de redondeo.
This guide is currently available in Spanish only. Your browser can translate it automatically.
Notación científica, pero en binario
En ciencias escribimos números muy grandes o muy pequeños en notación científica: 0,000123 = 1,23 × 10⁻⁴. Así separamos las cifras significativas (1,23) de la escala (10⁻⁴). El estándar IEEE 754, que usan casi todos los ordenadores desde los años 80, hace lo mismo en base 2: guarda cada número como signo × mantisa × 2exponente.
Las tres partes
| Formato | Signo | Exponente | Mantisa | Total |
|---|---|---|---|---|
| Precisión simple (float) | 1 bit | 8 bits | 23 bits | 32 bits |
| Precisión doble (double) | 1 bit | 11 bits | 52 bits | 64 bits |
- Signo: 0 para positivo, 1 para negativo.
- Exponente: se guarda con un sesgo (127 en simple, 1023 en doble) para poder representar exponentes negativos sin necesitar otro bit de signo.
- Mantisa: las cifras significativas. Como un número binario normalizado siempre empieza por «1,», ese 1 no se guarda (es el llamado bit implícito), lo que regala un bit extra de precisión.
Ejemplo completo: −6,25 en precisión simple
- Signo: es negativo → 1.
- Pasar 6,25 a binario: 6 = 110 y 0,25 = 0,01 → 110,01.
- Normalizar: 110,01 = 1,1001 × 2². El exponente real es 2.
- Exponente con sesgo: 2 + 127 = 129 =
10000001. - Mantisa: lo que va tras la coma, 1001, rellenado a 23 bits →
10010000000000000000000.
Resultado: 1 10000001 10010000000000000000000, que en hexadecimal es 0xC0C80000.
Cómo pasar la parte decimal a binario
Para la parte entera se divide entre 2; para la parte decimal se hace lo contrario: se multiplica por 2 y se apunta la parte entera del resultado (0 o 1), repitiendo con lo que queda. Con 0,25: 0,25 × 2 = 0,5 → 0; 0,5 × 2 = 1,0 → 1; queda 0 y se termina. Resultado: 0,01.
Por qué 0,1 + 0,2 no da 0,3
Si repetimos el método con 0,1, la secuencia nunca termina: 0,1 en binario es 0,0001100110011… con el patrón «0011» repitiéndose para siempre. Como la mantisa tiene un número limitado de bits, el ordenador guarda el valor más cercano posible, que no es exactamente 0,1. En precisión simple, lo que se guarda es 0,100000001490116…
Al sumar dos números que ya llevan un pequeño error, el error se acumula. Por eso en JavaScript, Python y muchos otros lenguajes, 0.1 + 0.2 devuelve 0.30000000000000004. No es un fallo del lenguaje, sino una consecuencia directa de IEEE 754. Cuando se necesita exactitud total (por ejemplo, con dinero), se usan enteros (céntimos) o tipos decimales especiales.
Valores especiales
IEEE 754 reserva algunas combinaciones para casos especiales: si todos los bits del exponente son 1 y la mantisa es 0, el número es infinito (positivo o negativo según el signo); si la mantisa no es 0, es NaN («not a number», el resultado de operaciones como 0 ÷ 0). También existen el +0 y el −0, que se comparan como iguales.