Los ordenadores guardan la mayoría de los números no enteros como valores de coma flotante: un signo, un exponente y una fracción, igual que la notación científica escribe 1,6 × 10^-1. El estándar IEEE 754 fija los detalles, de modo que un double se comporta igual en todas las máquinas. El coste es que solo algunos números pueden guardarse con exactitud. Inspeccione cualquier valor con Conversor de Flotantes IEEE 754 y compare los tipos principales en Float vs Double vs Decimal.
Signo, exponente, fracción
Un número binario de coma flotante es (-1)^signo × 1.fracción × 2^(exponente - sesgo). El 1. inicial está implícito (un «bit oculto»), de modo que un double obtiene 53 bits de precisión con 52 bits de fracción almacenados.
Ejemplo resuelto: 0,1
En doble precisión, 0,1 se guarda como los 64 bits 3fb999999999999a (hexadecimal): signo 0, exponente 1019 (es decir, 1019 - 1023 = -4) y fracción 0x999999999999a, que significa aproximadamente 1,6 × 2^-4. Como 1/10 no tiene expansión binaria finita, el valor guardado es el double más cercano:
0.1000000000000000055511151231257827021181583404541015625
El valor en precisión simple 3dcccccd es 0.100000001490116119384765625. Ninguno es igual a 0,1; el error es demasiado pequeño para verse al imprimir normalmente.
Los formatos habituales
| Formato | Bits | Bits de exponente | Bits de fracción | Mayor valor | Menor normal | Menor subnormal | Separación en 1,0 |
|---|---|---|---|---|---|---|---|
| media (binary16) | 16 | 5 | 10 | 65,504 | 6,10 × 10^-5 | 5,96 × 10^-8 | 9,77 × 10^-4 |
| simple (binary32) | 32 | 8 | 23 | 3,4028235 × 10^38 | 1,1754944 × 10^-38 | 1,4 × 10^-45 | 1,19 × 10^-7 |
| doble (binary64) | 64 | 11 | 52 | 1,7976931348623157 × 10^308 | 2,2250738585072014 × 10^-308 | 4,9 × 10^-324 | 2,22 × 10^-16 |
Valores especiales
- El cero tiene signo:
+0y-0son iguales al compararlos pero difieren en algunas operaciones (1 / -0es-infinito). - El infinito resulta de un desbordamiento o de dividir entre cero. NaN (no es un número) resulta de
0 / 0osqrt(-1), yNaNno es igual a nada, ni siquiera a sí mismo. - Los números subnormales llenan el hueco entre cero y el menor número normal, cambiando precisión por un desbordamiento por defecto gradual.
Sorpresas de redondeo y hábitos seguros
- Sumar diez veces 0,1 da
0.9999999999999999, no 1. - La suma no es asociativa:
1e16 + 1 - 1e16es0, pero1e16 - 1e16 + 1es1, porque la separación cerca de 10^16 es 2. - No compare nunca con
==. Pruebeabs(a - b) <= tolerancia, escalada al tamaño de los valores. - Sume muchos números del menor al mayor, o use suma compensada.
- Para dinero, use enteros (céntimos) o un tipo decimal.