ieee754 floating-point computer-science precision programming-fundamentals

Estándar IEEE 754 para Punto Flotante: Entendiendo la Aritmética Computacional

¿Alguna vez se preguntó por qué 0.1 + 0.2 != 0.3? Conozca la mecánica de la representación y precisión de punto flotante IEEE 754.

2026-04-11

Estándar IEEE 754 para Punto Flotante: Entendiendo la Aritmética Computacional

Si ha pasado algún tiempo programando, es probable que se haya encontrado con un fenómeno extraño: 0.1 + 0.2 no es igual a 0.3. En su lugar, obtiene algo como 0.30000000000000004. Esto no es un error en su lenguaje; es una consecuencia fundamental de cómo las computadoras representan números reales usando el estándar IEEE 754.

En esta guía, desmitificaremos el estándar IEEE 754, explicaremos cómo se almacenan los números de punto flotante y brindaremos consejos para manejar problemas de precisión en su código.


¿Qué es IEEE 754?

El Estándar de la IEEE para Aritmética de Punto Flotante (IEEE 754) es el estándar más utilizado para el cómputo de punto flotante. Establecido en 1985, define formatos para representar números reales en binario y las operaciones realizadas sobre ellos.

Los formatos más comunes son:

  • Precisión Simple (32 bits): Usado en float en C/C++/Java.
  • Precisión Doble (64 bits): Usado en double en C/C++/Java y es el tipo de número predeterminado en JavaScript y Python.

Cómo funciona: La anatomía de un Float

Un número de punto flotante se representa de manera similar a la notación científica ($1.23 \times 10^4$), pero en binario. Consta de tres partes:

  1. Bit de Signo (1 bit): 0 para positivo, 1 para negativo.
  2. Exponente: Determina la escala del número.
  3. Mantisa (Significando): Representa los dígitos significativos.

Diseño de Precisión Doble de 64 bits:

  • Signo: 1 bit
  • Exponente: 11 bits
  • Mantisa: 52 bits

La fórmula utilizada es: $(-1)^{signo} \times (1.mantisa) \times 2^{exponente - sesgo}$


¿Por qué $0.1 + 0.2 \neq 0.3$?

La causa raíz es que la mayoría de las fracciones decimales no se pueden representar exactamente en binario.

  • En base 10, una fracción se puede representar exactamente si los factores primos de su denominador son solo 2 y 5 (los factores de 10).
  • En base 2, una fracción solo se puede representar exactamente si los factores primos de su denominador son solo 2.

$0.1$ es $1/10$. Dado que 10 tiene un factor de 5, se convierte en una secuencia repetitiva infinita en binario: 0.00011001100110011...

Las computadoras deben redondear esta secuencia infinita para que quepa en 32 o 64 bits, lo que genera los pequeños errores que vemos.


Valores especiales

IEEE 754 también define varios valores especiales para manejar casos extremos:

  • NaN (Not a Number): Resultado de operaciones indefinidas (p. ej., 0/0).
  • Infinito ($\infty$): Resultado de desbordamiento o división por cero (1/0).
  • Cero negativo (-0): Distinto del cero positivo en algunos cálculos.

Mejores prácticas para desarrolladores

  1. Nunca use == para floats: Siempre verifique si la diferencia es menor que un valor minúsculo (épsilon).
    if (Math.abs(0.1 + 0.2 - 0.3) < Number.EPSILON) { ... }
    
  2. Use decimales para el dinero: Para cálculos financieros, use librerías especializadas (como decimal.js) o almacene valores como enteros (p. ej., centavos en lugar de dólares).
  3. Tenga en cuenta el rango: La precisión doble puede representar números muy grandes, pero la precisión disminuye a medida que los números crecen.

Preguntas frecuentes FAQ

P: ¿El punto flotante es no determinista? R: Generalmente, no. Dados los mismos datos de entrada y el mismo modo de redondeo, IEEE 754 debería producir los mismos resultados. Sin embargo, diferentes compiladores o instrucciones de CPU (como FMA) podrían causar ligeras variaciones.

P: ¿Qué es "BigInt"? R: BigInt (en JS) maneja enteros de precisión arbitraria. No maneja fracciones. Para fracciones, necesita una librería Decimal.

P: ¿Cuántos dígitos decimales de precisión tiene un double? R: Un double de 64 bits tiene unos 15 a 17 dígitos decimales significativos.


Herramientas relacionadas