Skip to content

Convertidor IEEE 754 de coma flotante

Convierte flotantes decimales a binario y hex IEEE 754: media, simple y doble precisión y bfloat16. Ve el valor exacto almacenado, el error de redondeo y los bits. 100% en tu navegador.

Sin rastreo Se ejecuta en el navegador Gratis
Todo se ejecuta localmente en tu navegador: los valores que escribes nunca salen de este dispositivo.
Formato
Valores especiales
Distribución de bits — haz clic en cualquier bit para invertirlo
Signo Exponente Mantisa
Desglose de campos
Signo
Exponente
Mantisa
Valor almacenado y error de redondeo
Introdujiste
Realmente almacenado
Error de redondeo
Valores representables vecinos
Anterior
Siguiente
ULP (tamaño del hueco)
Parámetros de los formatos IEEE 754 de un vistazo
Formato Bits totales Signo Exponente Mantisa Sesgo Valor finito máximo Dígitos decimales
binary16 (FP16)1615101565504~3.3
bfloat1616187127≈3.39×10³⁸~2.3
binary32 (FP32)321823127≈3.40×10³⁸~7.2
binary64 (FP64)64111521023≈1.80×10³⁰⁸~15.9
Revisado para verificar su exactitud numérica frente a las definiciones de formato de IEEE 754-2019; cada valor de ejemplo verificado con aritmética exacta de enteros grandes — Equipo de Ingeniería de Go-Tools · Jul 16, 2026

¿Qué es la coma flotante IEEE 754?

IEEE 754 es el estándar que define cómo los ordenadores almacenan números reales en binario. Cada valor se empaqueta en tres campos: un bit de signo, un exponente (almacenado con un sesgo para poder representar tanto magnitudes enormes como diminutas) y una mantisa que contiene los dígitos significativos. Casi todas las CPU, GPU y lenguajes de programación lo usan, y por eso las mismas sorpresas de redondeo aparecen por igual en JavaScript, Python, C y SQL.

La idea clave es que la coma flotante binaria solo puede representar números de la forma m × 2ⁿ. Las fracciones decimales como 0.1 son fracciones periódicas infinitas en base 2 —0.000110011001100…—, así que el formato almacena en su lugar el vecino representable más cercano. En precisión simple ese vecino es 0.100000001490116119384765625; en precisión doble es 0.1000000000000000055511151231257827021181583404541015625. Ninguno de los dos es 0.1. Toda rareza posterior —0.1 + 0.2 ≠ 0.3, sumas que se desvían, comparaciones de igualdad que fallan— se deriva de este único hecho, y este convertidor lo hace visible imprimiendo el valor almacenado exacto en lugar de una aproximación redondeada de vuelta.

El estándar también reserva patrones de bits para los valores especiales. Un exponente todo unos codifica ±Infinity (mantisa cero) o NaN (mantisa distinta de cero); un exponente todo ceros codifica el cero con signo (mantisa cero) o los números subnormales (mantisa distinta de cero), que rellenan el hueco de underflow junto al cero con precisión reducida. Los cuatro formatos que cubre esta herramienta —binary16/FP16, bfloat16, binary32/FP32, binary64/FP64— difieren solo en cuántos bits asignan a cada campo: más bits de exponente significan más rango, más bits de mantisa significan más precisión. bfloat16, el favorito del aprendizaje automático, es simplemente FP32 con los 16 bits inferiores de la mantisa recortados: mismo rango, precisión mucho más gruesa.

Un modelo mental útil es que los flotantes representables forman una cuadrícula sobre la recta numérica cuyo espaciado —una unidad en el último lugar, o ULP— se duplica en cada potencia de dos. Cerca de 1.0 el espaciado de la cuadrícula de un double es de unos 2.22 × 10⁻¹⁶; cerca de 2⁵³ es un entero completo, y por eso los double no pueden contar de forma fiable más allá de 2⁵³. El panel de vecinos de esta herramienta muestra esa cuadrícula directamente: los valores representables anterior y siguiente alrededor de lo que escribas, con la distancia exacta entre ellos.

// Float ↔ hex through the raw IEEE 754 bits (works in any browser / Node.js)
const buf = new DataView(new ArrayBuffer(8));

function floatToHex32(value) {
  buf.setFloat32(0, value); // rounds to nearest even
  return '0x' + buf.getUint32(0).toString(16).toUpperCase().padStart(8, '0');
}

function hexToFloat32(hex) {
  buf.setUint32(0, parseInt(hex, 16));
  return buf.getFloat32(0);
}

floatToHex32(0.1);        // '0x3DCCCCCD'
floatToHex32(3.14159);    // '0x40490FD0'
hexToFloat32('3DCCCCCD'); // 0.10000000149011612

Funciones principales

Cuatro formatos, una sola vista

Media (FP16), bfloat16, Simple (FP32) y Doble (FP64): cambia con un clic y toda la página se recalcula, así que comparar cómo cae el mismo número en cada formato lleva segundos.

Cuadrícula de bits clicable

Cada bit es un botón. Invierte el signo, ajusta el exponente o toca un bit de la mantisa y observa cómo las vistas decimal, hexadecimal y binaria se actualizan al instante: la forma más rápida de ganar intuición sobre la codificación.

Valor almacenado exacto, no una aproximación

La herramienta calcula la expansión decimal completa de los bits almacenados con aritmética exacta de enteros grandes —los 55 dígitos del 0.1 de un double— más el error de redondeo exacto con signo respecto a lo que escribiste.

Vecinos y ULP

Ve los valores representables anterior y siguiente alrededor del número actual y la distancia exacta (ULP) entre ellos: el espaciado de la cuadrícula que determina cuánta precisión tienes realmente en cada magnitud.

Valores especiales a un clic

Los chips cargan ±0, ±Infinity, NaN, el menor subnormal y el mayor valor finito del formato seleccionado, y la insignia de clasificación indica qué codifica el patrón de bits actual.

Enlaces permanentes compartibles, cero subidas

Copiar enlace codifica el formato y el patrón de bits exacto en la URL: ideal para informes de errores, revisiones de código y docencia. Todo se ejecuta en tu navegador; nada de lo que escribes sale de la página.

Ejemplos de conversión IEEE 754

0.1 en precisión simple: el error de redondeo clásico

0.1
0x3DCCCCCD — en realidad se almacena como 0.100000001490116119384765625

El decimal 0.1 no tiene representación binaria finita, así que IEEE 754 almacena en su lugar el valor representable más cercano. En precisión simple (FP32) ese valor es 0x3DCCCCCD, que es exactamente 0.100000001490116119384765625: aproximadamente 1.49 × 10⁻⁹ de más. La herramienta muestra este valor almacenado exacto y el error exacto, dígito a dígito, en lugar del '0.1' redondeado que tu lenguaje de programación te devuelve al imprimir. Este único ejemplo explica la mayoría de las sorpresas de la coma flotante, incluido por qué 0.1 + 0.2 no es igual a 0.3.

Flotante a hex: 3.14159 en FP32

3.14159
0x40490FD0

Escribe 3.14159 con Simple (FP32) seleccionado y el campo hexadecimal mostrará 0x40490FD0: signo 0, exponente sesgado 128 (es decir, 2¹), mantisa 0x490FD0. El valor realmente almacenado es 3.141590118408203125, un pelín por encima de lo que escribiste. La forma hexadecimal es la que ves en capturas de red, búferes de GPU, vistas de registros y archivos binarios serializados, y la conversión funciona en ambos sentidos: pega 40490FD0 en el campo hexadecimal para decodificarlo de vuelta.

Máximo de FP16: 65504 es donde termina la media precisión

65504
0x7BFF — el mayor valor finito de FP16

La media precisión solo tiene 5 bits de exponente y 10 de mantisa, así que su mayor valor finito es 65504 (0x7BFF). Escribe 65520 o cualquier valor mayor y el resultado se redondea a Infinity (0x7C00), un riesgo real al cuantizar modelos de aprendizaje automático a FP16. Cambia a bfloat16 y el mismo 65520 cabe sin problema, porque bfloat16 conserva los 8 bits de exponente de FP32 (rango) a cambio de renunciar a bits de mantisa (precisión). Ese compromiso es exactamente la razón por la que el entrenamiento de ML prefiere bfloat16 y el almacenamiento compacto prefiere FP16.

−0 y +0: dos patrones de bits distintos, un mismo valor

-0
0x80000000 (FP32), mientras que +0 es 0x00000000

IEEE 754 tiene un cero con signo: −0 activa solo el bit de signo (0x80000000 en FP32), mientras que +0 es todo ceros. Se comparan como iguales en todos los lenguajes, y sin embargo 1/−0 es −Infinity y 1/+0 es +Infinity, así que la diferencia es observable. Haz clic en el bit de signo en la herramienta para alternar entre ambos y observa cómo la insignia de clasificación permanece en Cero mientras el hex cambia: una ilustración con un solo clic de por qué la igualdad a nivel de bits y la igualdad numérica son cosas distintas.

Cómo convertir números IEEE 754 de coma flotante

  1. 1

    Elige un formato de coma flotante

    Simple (FP32) viene preseleccionado. Cambia a Doble (FP64) para números al estilo de JavaScript/Python, o a Media (FP16) y bfloat16 para los formatos de 16 bits usados en aprendizaje automático y gráficos.

  2. 2

    Escribe un número decimal

    Introduce cualquier valor —0.1, -2.5e3, 65504— o usa los chips de valores especiales para ±0, ±Infinity, NaN, el menor subnormal y el mayor valor finito. La conversión ocurre mientras escribes.

  3. 3

    Lee la distribución de bits codificada por colores

    El bit de signo, el campo del exponente y la mantisa se resaltan en colores distintos, y la tabla de desglose de campos muestra los bits en bruto, la aritmética del sesgo y el bit inicial implícito.

  4. 4

    Comprueba el valor almacenado exacto y el error

    El panel de precisión imprime el valor realmente almacenado —cada dígito, calculado de forma exacta— junto al error de redondeo respecto a lo que escribiste, además de los vecinos representables anterior y siguiente y la distancia en ULP.

  5. 5

    Invierte bits, pega hex, copia resultados

    Haz clic en cualquier bit para invertirlo, o pega cadenas hexadecimales (3DCCCCCD) y binarias para decodificarlas de vuelta a decimal. Copia el hex, el binario, el valor exacto o un enlace compartible que reproduce el patrón de bits exacto.

Errores comunes de coma flotante

Fiarse del valor impreso en lugar del almacenado

Los lenguajes imprimen los flotantes redondeados a la cadena más corta que sobrevive al viaje de ida y vuelta, así que 0.1 parece limpio aunque el valor almacenado no lo sea. Juzga la precisión por la expansión exacta, no por lo que muestra print().

✗ Incorrecto
print(0.1)  # 0.1 — parece exacto, no lo es
✓ Correcto
0.1 almacenado (FP64) = 0.1000000000000000055511151231257827021181583404541015625

Comparar flotantes por igualdad exacta

0.1 + 0.2 cae en el patrón de bits 0x3FD3333333333334 mientras que el literal 0.3 es 0x3FD3333333333333: a un ULP de distancia, así que == es falso aunque ambos se impriman como valores cercanos a 0.3.

✗ Incorrecto
if (0.1 + 0.2 === 0.3) { … }   // nunca se ejecuta
✓ Correcto
if (Math.abs(a - b) < 1e-9) { … }   // tolerancia ajustada a tus datos

Cuantizar a FP16 sin comprobar el rango

El mayor valor finito de FP16 es 65504. Cualquier cosa mayor se convierte en Infinity, y una vez que un Infinity entra en un cálculo, se propaga. Comprueba tus máximos antes de reducir la precisión, o usa bfloat16, que conserva el rango de FP32.

✗ Incorrecto
fp16(65520)   → Infinity (0x7C00) — desbordamiento silencioso
✓ Correcto
bf16(65520)   → finito (bfloat16 conserva 8 bits de exponente)

Comprobar NaN con igualdad

NaN es el único valor que no es igual a sí mismo; es así por diseño, para que un cálculo fallido no pueda hacerse pasar por un número real. Usa la comprobación isNaN de tu lenguaje en lugar de ==, y recuerda que existen millones de patrones de bits NaN distintos.

✗ Incorrecto
if (x === NaN) { … }        // siempre falso, incluso cuando x ES NaN
✓ Correcto
if (Number.isNaN(x)) { … }  // la comprobación correcta

Qué puedes hacer con el convertidor IEEE 754

Depura datos binarios serializados
Pega el hex que encontraste en una captura de red, un búfer de GPU, un volcado de registros o un formato de archivo y decodifícalo al valor decimal exacto, o ve en sentido contrario para escribir fixtures de prueba. Nota sobre el orden de bytes: el hex mostrado es el patrón de bits big-endian; si tu volcado es little-endian, invierte el orden de bytes antes de pegarlo.
Entiende la cuantización en ML
Comprueba si tus valores sobreviven al techo de 65504 de FP16, compara la pérdida de precisión de FP16 frente a bfloat16 dígito a dígito e inspecciona el rango subnormal donde los gradientes sufren underflow.
Explica un bug de coma flotante
Cuando un colega pregunte por qué difieren dos números 'iguales', envíale un enlace permanente que muestre ambos patrones de bits y los valores almacenados exactos: la discusión se resuelve sola. Combínalo con la herramienta de diferencias de texto para volcados más largos.
Aprende o enseña la codificación
Las asignaturas de arquitectura de computadores se vuelven concretas cuando los estudiantes pueden hacer clic en los bits del exponente y ver actualizarse la aritmética del sesgo. La tabla de desglose de campos refleja cómo dibujan el formato los libros de texto.
Decodifica registros embebidos e industriales
Las cargas útiles de Modbus, CAN y sensores suelen transportar valores FP32 como palabras hex en bruto. Pega aquí la palabra para leer el valor físico sin escribir un script improvisado.

Formatos IEEE 754 y valores especiales

Los cuatro formatos binarios de un vistazo
binary16 (FP16): 1 bit de signo + 5 de exponente + 10 de mantisa, sesgo 15, máximo 65504, ~3.3 dígitos decimales. bfloat16: 1 + 8 + 7, sesgo 127, máximo ≈ 3.39 × 10³⁸, ~2.3 dígitos. binary32 (FP32): 1 + 8 + 23, sesgo 127, máximo ≈ 3.40 × 10³⁸, ~7.2 dígitos. binary64 (FP64): 1 + 11 + 52, sesgo 1023, máximo ≈ 1.80 × 10³⁰⁸, ~15.9 dígitos. El patrón: los bits de exponente compran rango, los bits de mantisa compran precisión, y bfloat16 cambia deliberadamente toda su precisión por el rango de FP32.
Cómo se ensambla un valor
Un número normal se decodifica como (−1)^signo × 1.mantisa × 2^(exponente − sesgo). El 1 inicial es implícito —no se almacena—, y por eso un campo de mantisa de 23 bits ofrece 24 bits de precisión. El exponente almacenado es el exponente real más el sesgo (127 en FP32), así que 2⁰ se almacena como 01111111. La tabla de desglose de campos de esta herramienta muestra cada paso de esa aritmética para el valor actual.
Valores especiales: los patrones de exponente reservados
Un exponente todo unos con mantisa cero es ±Infinity; con cualquier mantisa distinta de cero es NaN (el NaN silencioso canónico activa el bit superior de la mantisa). Un exponente todo ceros con mantisa cero es ±0; con mantisa distinta de cero es un subnormal, decodificado como 0.mantisa × 2^(1 − sesgo), sin 1 inicial implícito. Estas reglas son idénticas en los cuatro formatos, y por eso los mismos chips funcionan en todos.
Redondeo: al más cercano, empates al par
Cuando un valor cae entre dos números representables, el modo por defecto de IEEE 754 redondea al más cercano; en un empate exacto elige el que tiene el último bit de mantisa a 0 (empates al par), lo que evita una deriva sistemática. Este convertidor aplica exactamente esa regla al estrechar tu entrada decimal al formato de destino, y el panel de error muestra la diferencia con signo resultante de forma exacta.
ULP: el espaciado de la cuadrícula de los flotantes
Los flotantes representables no están repartidos de manera uniforme: la distancia entre vecinos (una unidad en el último lugar) se duplica en cada potencia de dos. Cerca de 1.0 el ULP de un double es 2⁻⁵² ≈ 2.22 × 10⁻¹⁶; cerca de 2⁵³ el ULP alcanza 1.0 y los enteros empiezan a saltarse. El panel de vecinos imprime el ULP actual de forma exacta, que es la respuesta honesta a «¿cuán preciso es mi número aquí?».

Buenas prácticas de coma flotante

Nunca compares flotantes con ==
Tras cualquier operación aritmética, dos expresiones matemáticamente iguales pueden quedar a un ULP de distancia. Compara contra una tolerancia adecuada a tus magnitudes, o cuenta los ULP entre los patrones de bits, que esta herramienta te permite inspeccionar directamente.
Mantén el dinero fuera de los flotantes binarios
Ninguna cuadrícula de potencias de dos contiene 0.10 exactamente, así que las divisas en flotantes acumulan errores visibles. Usa céntimos enteros o un tipo decimal; el panel de valor almacenado exacto de esta herramienta es la prueba permanente del porqué.
Elige el formato de 16 bits por rango, no por costumbre
Si tus valores pueden superar 65504 —pérdidas, gradientes, picos físicos—, FP16 se desbordará a Infinity donde bfloat16 sigue funcionando. Si todo está normalizado en una banda estrecha, los bits extra de mantisa de FP16 dan una precisión visiblemente mejor.
Cuidado con la trampa del doble redondeo al estrechar
Convertir decimal → double → half puede caer a un ULP de distancia de convertir decimal → half directamente en raros casos intermedios. Esta herramienta redondea tu entrada decimal al formato de destino en un solo paso, así que lo que ves es la respuesta IEEE 754 honesta.
Espera que los enteros se rompan por encima de 2⁵³
Un double almacena exactamente todos los enteros hasta 2⁵³ y a partir de ahí empieza a saltárselos: 2⁵³ + 1 no es representable. Si manejas IDs o contadores cerca de esa escala, usa enteros de 64 bits o cadenas, y comprueba aquí los valores sospechosos a nivel de bits.

Preguntas frecuentes sobre el convertidor IEEE 754

¿Por qué 0.1 + 0.2 no es igual a 0.3?
Porque ninguno de los tres números existe en coma flotante binaria. Un double almacena 0.1 como exactamente 0.1000000000000000055511151231257827021181583404541015625 y 0.2 con un pequeño exceso similar; al sumarlos se obtiene 0.3000000000000000444089209850062616169452667236328125 (bits 0x3FD3333333333334), mientras que el literal 0.3 se redondea a 0.299999999999999988897769753748434595763683319091796875 (bits 0x3FD3333333333333). La suma cae un paso representable por encima del literal —dos patrones de bits distintos—, así que 0.1 + 0.2 == 0.3 es falso en todos los lenguajes IEEE 754: JavaScript, Python, Java, C, Rust, Go. Escribe 0.1 en este convertidor y lee el valor almacenado exacto para ver la causa raíz con tus propios ojos.
¿Qué es IEEE 754?
IEEE 754 es el estándar técnico de aritmética en coma flotante binaria que usan prácticamente todas las CPU, GPU y lenguajes de programación modernos. Define cómo se empaqueta un número en bits —un bit de signo, un campo de exponente y una mantisa (significando)—, además de las reglas de redondeo y los valores especiales Infinity, NaN, el cero con signo y los subnormales. Los formatos que encontrarás en la práctica son binary32 (float, FP32), binary64 (double, FP64), binary16 (half, FP16) y el truncamiento relacionado bfloat16 usado en aprendizaje automático. Este convertidor muestra los cuatro a nivel de bits.
¿Cuál es la diferencia entre FP16 y bfloat16?
Ambos son formatos de 16 bits, pero reparten sus bits de forma distinta. FP16 (IEEE binary16) usa 5 bits de exponente y 10 de mantisa: más precisión, pero un rango minúsculo —el mayor valor finito es 65504—, así que el desbordamiento a Infinity es un riesgo constante. bfloat16 conserva los 8 bits de exponente de FP32 y solo 7 de mantisa: el rango completo de ±3.4 × 10³⁸ de un float, con una precisión mucho más gruesa. Por eso el entrenamiento de ML, donde los gradientes pueden dispararse mucho más allá de 65504, se estandarizó en bfloat16, mientras que FP16 encaja mejor en almacenamiento e inferencia, donde los valores están controlados. Compáralos aquí: escribe 0.1 y cambia de formato — FP16 almacena 0.0999755859375 (0x2E66), bfloat16 almacena 0.10009765625 (0x3DCD).
¿Qué son los números subnormales (denormales)?
Cuando el campo del exponente es todo ceros, IEEE 754 elimina el 1 inicial implícito y deja que la mantisa se reduzca gradualmente hacia cero: son los números subnormales (término antiguo: denormales). Rellenan el hueco entre el cero y el menor número normal, de modo que la diferencia de dos flotantes distintos nunca puede redondearse a cero (underflow gradual). El coste es una precisión reducida y, en muchas CPU, una aritmética más lenta. En FP16 el menor subnormal es 2⁻²⁴ = 0.000000059604644775390625; haz clic en el chip Mín. subnormal en cualquier formato para inspeccionar su patrón de bits: bits de exponente todos a cero, mantisa 0…001.
¿Debería usar float o double?
Usa double (FP64) por defecto salvo que tengas una razón medida para no hacerlo. Un double ofrece unos 15–16 dígitos decimales significativos frente a los aproximadamente 7 de un float, y la mayoría de los lenguajes (los números de JavaScript, los float de Python) solo usan double de todos modos. Elige float (FP32) cuando el ancho de banda de memoria o el almacenamiento dominen —arrays grandes, pipelines de GPU, gráficos— y hayas confirmado que 7 dígitos bastan. Para dinero, usa enteros (céntimos) o un tipo decimal: ningún formato binario almacena 0.1 exactamente, como demuestra el panel de valor almacenado de esta herramienta. Si necesitas inspeccionar bases enteras, consulta el convertidor de bases numéricas.
¿Cómo convierto un flotante a hexadecimal a mano?
Toma el signo (0 para positivo, 1 para negativo). Escribe el valor absoluto en binario y normalízalo a 1.xxx × 2ⁿ. Suma el sesgo del formato a n (127 para FP32, 1023 para FP64) y escríbelo en los bits del exponente. Descarta el 1 inicial y quédate con los siguientes 23 (o 52) bits de la fracción como mantisa, redondeando al par más cercano en el corte. Concatena signo, exponente y mantisa y agrupa cada 4 bits en un dígito hexadecimal. Para 3.14159 en FP32 eso da 0 | 10000000 | 10010010000111111010000 → 0x40490FD0 — o sáltate la aritmética y deja que este convertidor haga cada paso de forma visible.
¿Se suben mis datos cuando uso este convertidor?
No. Cada conversión se ejecuta localmente en tu navegador con JavaScript puro —aritmética con DataView y BigInt, sin viajes al servidor y sin bibliotecas de terceros—. Puedes abrir las herramientas de desarrollo de tu navegador y comprobar que el panel de red permanece en silencio mientras escribes, o desconectarte de internet por completo y seguir convirtiendo. El botón Copiar enlace codifica el patrón de bits en el fragmento de la URL, que tampoco se envía nunca a ningún servidor.

Herramientas relacionadas

Ver todas las herramientas →