Skip to content

Conversor IEEE 754 de Ponto Flutuante

Converta floats decimais em binário e hex IEEE 754 — meia, simples e dupla precisão e bfloat16. Veja o valor exato armazenado, o erro de arredondamento e o layout de bits. 100% no seu navegador.

Sem rastreamento Roda no navegador Grátis
Tudo roda localmente no seu navegador — os valores que você digita nunca saem deste dispositivo.
Formato
Valores especiais
Layout de bits — clique em qualquer bit para invertê-lo
Sinal Expoente Mantissa
Detalhamento dos campos
Sinal
Expoente
Mantissa
Valor armazenado e erro de arredondamento
Você digitou
Realmente armazenado
Erro de arredondamento
Valores representáveis vizinhos
Anterior
Próximo
ULP (tamanho do intervalo)
Parâmetros dos formatos IEEE 754 em resumo
Formato Total de bits Sinal Expoente Mantissa Viés Valor finito máximo Dígitos decimais
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 quanto à precisão numérica em relação às definições de formato do IEEE 754-2019; cada valor de exemplo verificado com aritmética exata de inteiros grandes — Equipe de Engenharia da Go-Tools · Jul 16, 2026

O Que É Ponto Flutuante IEEE 754?

IEEE 754 é o padrão que define como os computadores armazenam números reais em binário. Cada valor é empacotado em três campos: um bit de sinal, um expoente (armazenado com um viés para poder representar magnitudes tanto grandes quanto minúsculas) e uma mantissa que guarda os dígitos significativos. Quase todas as CPUs, GPUs e linguagens de programação o utilizam, e é por isso que as mesmas surpresas de arredondamento aparecem igualmente em JavaScript, Python, C e SQL.

A ideia central é que o ponto flutuante binário só consegue representar números da forma m × 2ⁿ. Frações decimais como 0.1 são frações binárias infinitas e periódicas — 0.000110011001100… — então o formato armazena em seu lugar o vizinho representável mais próximo. Em precisão simples esse vizinho é 0.100000001490116119384765625; em precisão dupla é 0.1000000000000000055511151231257827021181583404541015625. Nenhum dos dois é 0.1. Toda esquisitice derivada — 0.1 + 0.2 ≠ 0.3, somas que derivam, comparações de igualdade que falham — decorre desse único fato, e este conversor o torna visível ao imprimir o valor armazenado exato em vez de uma aproximação arredondada de volta.

O padrão também reserva padrões de bits para valores especiais. Um expoente todo em uns codifica ±Infinity (mantissa zero) ou NaN (mantissa diferente de zero); um expoente todo em zeros codifica o zero com sinal (mantissa zero) ou os números subnormais (mantissa diferente de zero), que preenchem a lacuna de underflow junto ao zero com precisão reduzida. Os quatro formatos cobertos por esta ferramenta — binary16/FP16, bfloat16, binary32/FP32, binary64/FP64 — diferem apenas em quantos bits dão a cada campo: mais bits de expoente significam mais alcance, mais bits de mantissa significam mais precisão. O bfloat16, o favorito do aprendizado de máquina, é simplesmente o FP32 com os 16 bits inferiores da mantissa cortados: mesmo alcance, precisão bem mais grosseira.

Um modelo mental útil é que os floats representáveis formam uma grade na reta numérica cujo espaçamento — uma unidade na última casa, ou ULP — dobra a cada potência de dois. Perto de 1.0, o espaçamento da grade de um double é de cerca de 2.22 × 10⁻¹⁶; perto de 2⁵³ ele é um inteiro completo, e é por isso que doubles não conseguem contar com confiabilidade além de 2⁵³. O painel de vizinhos desta ferramenta mostra essa grade diretamente: os valores representáveis anterior e seguinte em torno do que você digitar, com o intervalo exato entre eles.

// 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

Recursos Principais

Quatro formatos, uma só visão

Meia (FP16), bfloat16, Simples (FP32) e Dupla (FP64) — alterne com um clique e a página inteira é recalculada, então comparar como o mesmo número cai em cada formato leva segundos.

Grade de bits clicável

Cada bit é um botão. Inverta o sinal, ajuste o expoente ou mexa em um bit da mantissa e veja as visões decimal, hex e binária se atualizarem na hora — a forma mais rápida de construir intuição sobre a codificação.

Valor armazenado exato, não uma aproximação

A ferramenta calcula a expansão decimal completa dos bits armazenados com aritmética exata de inteiros grandes — todos os 55 dígitos do 0.1 de um double — além do erro de arredondamento exato, com sinal, em relação ao que você digitou.

Vizinhos e ULP

Veja os valores representáveis anterior e seguinte em torno do número atual e o intervalo exato (ULP) entre eles — o espaçamento de grade que determina quanta precisão você realmente tem em cada magnitude.

Valores especiais a um clique

Chips carregam ±0, ±Infinity, NaN, o menor subnormal e o maior valor finito do formato selecionado, com o selo de classificação nomeando o que o padrão de bits atual codifica.

Permalinks compartilháveis, zero upload

Copiar link codifica o formato e o padrão de bits exato na URL — ideal para relatórios de bug, revisões de código e ensino. Tudo roda no seu navegador; nada do que você digita sai da página.

Exemplos de Conversão IEEE 754

0.1 em precisão simples — o clássico erro de arredondamento

0.1
0x3DCCCCCD — armazenado na verdade como 0.100000001490116119384765625

O decimal 0.1 não tem representação binária finita, então o IEEE 754 armazena em seu lugar o valor representável mais próximo. Em precisão simples (FP32) esse valor é 0x3DCCCCCD, que é exatamente 0.100000001490116119384765625 — cerca de 1.49 × 10⁻⁹ a mais. A ferramenta mostra esse valor armazenado exato e o erro exato, dígito por dígito, em vez do '0.1' arredondado que sua linguagem de programação imprime de volta. Este único exemplo explica a maioria das surpresas de ponto flutuante, inclusive por que 0.1 + 0.2 não é igual a 0.3.

Float para hex: 3.14159 em FP32

3.14159
0x40490FD0

Digite 3.14159 com Simples (FP32) selecionado e o campo hex mostra 0x40490FD0 — sinal 0, expoente com viés 128 (ou seja, 2¹), mantissa 0x490FD0. O valor realmente armazenado é 3.141590118408203125, um fio acima do que você digitou. A forma hexadecimal é o que você vê em capturas de rede, buffers de GPU, visualizações de registradores e arquivos binários serializados, e a conversão funciona nos dois sentidos: cole 40490FD0 no campo hex para decodificá-lo de volta.

Máximo do FP16: 65504 é onde a meia precisão termina

65504
0x7BFF — o maior valor finito do FP16

A meia precisão tem apenas 5 bits de expoente e 10 bits de mantissa, então seu maior valor finito é 65504 (0x7BFF). Digite 65520 ou qualquer coisa maior e o resultado arredonda para Infinity (0x7C00) — um risco real ao quantizar modelos de aprendizado de máquina para FP16. Mude para bfloat16 e o mesmo 65520 cabe com folga, porque o bfloat16 mantém os 8 bits de expoente do FP32 (alcance) e abre mão de bits de mantissa (precisão). Essa troca é exatamente o motivo pelo qual o treinamento de ML prefere o bfloat16 e o armazenamento compacto prefere o FP16.

−0 e +0: dois padrões de bits diferentes, um único valor

-0
0x80000000 (FP32), enquanto +0 é 0x00000000

O IEEE 754 tem zero com sinal: −0 aciona apenas o bit de sinal (0x80000000 em FP32), enquanto +0 é todo zeros. Eles comparam como iguais em todas as linguagens, mas 1/−0 é −Infinity e 1/+0 é +Infinity, então a diferença é observável. Clique no bit de sinal na ferramenta para alternar entre eles e veja o selo de classificação permanecer em Zero enquanto o hex muda — uma ilustração de um clique de por que igualdade em nível de bits e igualdade numérica são coisas diferentes.

Como Converter Números de Ponto Flutuante IEEE 754

  1. 1

    Escolha um formato de ponto flutuante

    Simples (FP32) vem pré-selecionado. Mude para Dupla (FP64) para números no estilo JavaScript/Python, ou para Meia (FP16) e bfloat16, os formatos de 16 bits usados em aprendizado de máquina e computação gráfica.

  2. 2

    Digite um número decimal

    Insira qualquer valor — 0.1, -2.5e3, 65504 — ou use os chips de valores especiais para ±0, ±Infinity, NaN, o menor subnormal e o maior valor finito. A conversão acontece enquanto você digita.

  3. 3

    Leia o layout de bits com código de cores

    O bit de sinal, o campo do expoente e a mantissa são destacados em cores diferentes, com a tabela de detalhamento dos campos mostrando os bits brutos, a aritmética do viés e o bit inicial implícito.

  4. 4

    Confira o valor armazenado exato e o erro

    O painel de precisão imprime o valor realmente armazenado — todos os dígitos, calculados de forma exata — ao lado do erro de arredondamento em relação ao que você digitou, além dos vizinhos representáveis anterior e seguinte e do intervalo em ULP.

  5. 5

    Inverta bits, cole hex, copie os resultados

    Clique em qualquer bit para invertê-lo, ou cole strings hex (3DCCCCCD) e binárias para decodificá-las de volta a decimal. Copie o hex, o binário, o valor exato ou um link compartilhável que reproduz o padrão de bits exato.

Erros Comuns de Ponto Flutuante

Confiar no valor impresso em vez do armazenado

As linguagens imprimem floats arredondados para a string mais curta que faz a viagem de ida e volta, então 0.1 parece limpo enquanto o valor armazenado não é. Julgue a precisão pela expansão exata, não pelo que o print() mostra.

✗ Incorreto
print(0.1)  # 0.1 — parece exato, não é
✓ Correto
0.1 armazenado (FP64) = 0.1000000000000000055511151231257827021181583404541015625

Comparar floats por igualdade exata

0.1 + 0.2 cai no padrão de bits 0x3FD3333333333334 enquanto o literal 0.3 é 0x3FD3333333333333 — um ULP de distância, então == é falso mesmo que ambos sejam impressos como valores próximos de 0.3.

✗ Incorreto
if (0.1 + 0.2 === 0.3) { … }   // nunca executa
✓ Correto
if (Math.abs(a - b) < 1e-9) { … }   // tolerância dimensionada aos seus dados

Quantizar para FP16 sem verificar o alcance

O maior valor finito do FP16 é 65504. Qualquer coisa maior vira Infinity, e uma vez que um Infinity entra em um cálculo, ele se propaga. Verifique seus máximos antes de rebaixar o formato — ou use bfloat16, que mantém o alcance do FP32.

✗ Incorreto
fp16(65520)   → Infinity (0x7C00) — estouro silencioso
✓ Correto
bf16(65520)   → finito (o bfloat16 mantém 8 bits de expoente)

Testar NaN com igualdade

NaN é o único valor que não é igual a si mesmo — isso é intencional, para que um cálculo que falhou não possa se passar por um número real. Use a verificação isNaN da linguagem em vez de ==, e lembre-se de que existem milhões de padrões de bits distintos de NaN.

✗ Incorreto
if (x === NaN) { … }        // sempre falso, mesmo quando x É NaN
✓ Correto
if (Number.isNaN(x)) { … }  // o teste correto

O Que Você Pode Fazer com o Conversor IEEE 754

Depure dados binários serializados
Cole o hex que você encontrou em uma captura de rede, buffer de GPU, dump de registradores ou formato de arquivo e decodifique-o para o valor decimal exato — ou vá no sentido contrário para escrever fixtures de teste. Nota sobre ordem de bytes: o hex mostrado é o padrão de bits big-endian; se o seu dump for little-endian, inverta a ordem dos bytes antes de colar.
Entenda a quantização em ML
Verifique se os seus valores sobrevivem ao teto de 65504 do FP16, compare a perda de precisão do FP16 contra o bfloat16 dígito por dígito e inspecione a faixa subnormal em que gradientes sofrem underflow.
Explique um bug de ponto flutuante
Quando um colega perguntar por que dois números 'iguais' diferem, envie um permalink mostrando os dois padrões de bits e os valores armazenados exatos — a discussão se resolve sozinha. Combine com a ferramenta de comparação de texto para dumps mais longos.
Aprenda ou ensine a codificação
O conteúdo de arquitetura de computadores fica concreto quando os alunos podem clicar nos bits do expoente e ver a aritmética do viés se atualizar. A tabela de detalhamento dos campos espelha a forma como os livros didáticos desenham o formato.
Decodifique registradores embarcados e industriais
Cargas de Modbus, CAN e sensores rotineiramente transportam valores FP32 como palavras hex brutas. Cole a palavra aqui para ler o valor físico sem escrever um script descartável.

Formatos IEEE 754 e Valores Especiais

Os quatro formatos binários em resumo
binary16 (FP16): 1 bit de sinal + 5 de expoente + 10 de mantissa, viés 15, máximo 65504, ~3.3 dígitos decimais. bfloat16: 1 + 8 + 7, viés 127, máximo ≈ 3.39 × 10³⁸, ~2.3 dígitos. binary32 (FP32): 1 + 8 + 23, viés 127, máximo ≈ 3.40 × 10³⁸, ~7.2 dígitos. binary64 (FP64): 1 + 11 + 52, viés 1023, máximo ≈ 1.80 × 10³⁰⁸, ~15.9 dígitos. O padrão: bits de expoente compram alcance, bits de mantissa compram precisão, e o bfloat16 troca deliberadamente toda a sua precisão pelo alcance do FP32.
Como um valor é montado
Um número normal decodifica como (−1)^sinal × 1.mantissa × 2^(expoente − viés). O 1 inicial é implícito — ele não é armazenado, e é por isso que um campo de mantissa de 23 bits entrega 24 bits de precisão. O expoente armazenado é o expoente verdadeiro mais o viés (127 no FP32), então 2⁰ é armazenado como 01111111. A tabela de detalhamento dos campos nesta ferramenta mostra cada etapa dessa aritmética para o valor atual.
Valores especiais: os padrões de expoente reservados
Expoente todo em uns com mantissa zero é ±Infinity; com qualquer mantissa diferente de zero é NaN (o NaN silencioso canônico aciona o bit mais alto da mantissa). Expoente todo em zeros com mantissa zero é ±0; com mantissa diferente de zero é um subnormal, decodificado como 0.mantissa × 2^(1 − viés) — sem o 1 inicial implícito. Essas regras são idênticas nos quatro formatos, e é por isso que os mesmos chips funcionam em cada um.
Arredondamento: para o mais próximo, empates para o par
Quando um valor cai entre dois números representáveis, o modo padrão do IEEE 754 arredonda para o mais próximo; em um empate exato, escolhe aquele cujo último bit da mantissa é 0 (empates para o par), o que evita deriva sistemática. Este conversor aplica exatamente essa regra ao estreitar sua entrada decimal para o formato de destino, e o painel de erro mostra a diferença resultante, com sinal, de forma exata.
ULP: o espaçamento de grade dos floats
Os floats representáveis não estão distribuídos uniformemente — o intervalo entre vizinhos (uma unidade na última casa) dobra a cada potência de dois. Perto de 1.0 o ULP de um double é 2⁻⁵² ≈ 2.22 × 10⁻¹⁶; perto de 2⁵³ o ULP chega a 1.0 e os inteiros começam a pular. O painel de vizinhos imprime o ULP atual de forma exata, que é a resposta honesta a 'quão preciso é meu número aqui?'.

Boas Práticas de Ponto Flutuante

Nunca compare floats com ==
Depois de qualquer aritmética, duas expressões matematicamente iguais podem ficar a um ULP de distância. Compare contra uma tolerância adequada às suas magnitudes — ou conte ULPs entre os padrões de bits, que esta ferramenta permite inspecionar diretamente.
Mantenha dinheiro fora de floats binários
Nenhuma grade de potências de dois contém 0.10 exatamente, então moeda em floats acumula erros visíveis. Use centavos inteiros ou um tipo decimal; o painel de valor armazenado exato aqui é a prova permanente do porquê.
Escolha o formato de 16 bits pelo alcance, não pelo hábito
Se os seus valores podem passar de 65504 — perdas, gradientes, picos de física — o FP16 vai estourar para Infinity onde o bfloat16 segue adiante. Se tudo está normalizado em uma faixa estreita, os bits extras de mantissa do FP16 dão precisão visivelmente melhor.
Cuidado com a armadilha do arredondamento duplo ao estreitar
Converter decimal → double → half pode cair a um ULP de distância de converter decimal → half diretamente, em raros casos de meio caminho. Esta ferramenta arredonda sua entrada decimal para o formato de destino em uma única etapa, então o que você vê é a resposta IEEE 754 honesta.
Espere que inteiros quebrem acima de 2⁵³
Um double armazena exatamente todo inteiro até 2⁵³ e depois começa a pular — 2⁵³ + 1 não é representável. Se você lida com IDs ou contadores perto dessa escala, use inteiros de 64 bits ou strings, e confira valores suspeitos aqui em nível de bits.

Perguntas Frequentes sobre o Conversor IEEE 754

Por que 0.1 + 0.2 não é igual a 0.3?
Porque nenhum dos três números existe em ponto flutuante binário. Um double armazena 0.1 como exatamente 0.1000000000000000055511151231257827021181583404541015625 e 0.2 com um pequeno excesso semelhante; somá-los dá 0.3000000000000000444089209850062616169452667236328125 (bits 0x3FD3333333333334), enquanto o literal 0.3 arredonda para 0.299999999999999988897769753748434595763683319091796875 (bits 0x3FD3333333333333). A soma cai um passo representável acima do literal — dois padrões de bits diferentes — então 0.1 + 0.2 == 0.3 é falso em toda linguagem IEEE 754: JavaScript, Python, Java, C, Rust, Go. Digite 0.1 neste conversor e leia o valor armazenado exato para ver a causa raiz com os próprios olhos.
O que é IEEE 754?
IEEE 754 é o padrão técnico de aritmética de ponto flutuante binária usado por praticamente todas as CPUs, GPUs e linguagens de programação modernas. Ele define como um número é empacotado em bits — um bit de sinal, um campo de expoente e uma mantissa (significando) — além das regras de arredondamento e dos valores especiais Infinity, NaN, zero com sinal e subnormais. Os formatos que você encontrará na prática são binary32 (float, FP32), binary64 (double, FP64), binary16 (meia, FP16) e o truncamento relacionado bfloat16 usado em aprendizado de máquina. Este conversor mostra os quatro em nível de bits.
Qual é a diferença entre FP16 e bfloat16?
Ambos são formatos de 16 bits, mas dividem seus bits de forma diferente. O FP16 (IEEE binary16) usa 5 bits de expoente e 10 bits de mantissa: mais precisão, porém um alcance minúsculo — o maior valor finito é 65504, então o estouro para Infinity é um risco constante. O bfloat16 mantém os 8 bits de expoente do FP32 e apenas 7 bits de mantissa: todo o alcance de ±3.4 × 10³⁸ de um float, com precisão bem mais grosseira. É por isso que o treinamento de ML, em que gradientes podem disparar muito além de 65504, padronizou o bfloat16, enquanto o FP16 serve ao armazenamento e à inferência, em que os valores estão domados. Compare-os aqui: digite 0.1 e alterne os formatos — o FP16 armazena 0.0999755859375 (0x2E66), o bfloat16 armazena 0.10009765625 (0x3DCD).
O que são números subnormais (denormais)?
Quando o campo do expoente é todo zeros, o IEEE 754 abre mão do 1 inicial implícito e deixa a mantissa encolher gradualmente rumo a zero — esses são os números subnormais (termo mais antigo: denormais). Eles preenchem a lacuna entre o zero e o menor número normal, de modo que a diferença de dois floats distintos nunca pode arredondar para zero (underflow gradual). O custo é precisão reduzida e, em muitas CPUs, aritmética mais lenta. No FP16 o menor subnormal é 2⁻²⁴ = 0.000000059604644775390625; clique no chip Subnormal mínimo em qualquer formato para inspecionar seu padrão de bits — bits de expoente todos zero, mantissa 0…001.
Devo usar float ou double?
Use double (FP64) por padrão, a menos que tenha um motivo medido para não usar. Um double carrega cerca de 15–16 dígitos decimais significativos contra aproximadamente 7 de um float, e a maioria das linguagens (números do JavaScript, floats do Python) só trabalha com double de qualquer forma. Escolha float (FP32) quando largura de banda de memória ou armazenamento dominarem — arrays grandes, pipelines de GPU, computação gráfica — e você tiver confirmado que 7 dígitos bastam. Para dinheiro, use inteiros (centavos) ou um tipo decimal: nenhum formato binário armazena 0.1 exatamente, como o painel de valor armazenado desta ferramenta demonstra. Se precisar inspecionar bases inteiras, veja o conversor de base numérica.
Como converter um float para hex manualmente?
Anote o sinal (0 para positivo, 1 para negativo). Escreva o valor absoluto em binário e normalize-o para 1.xxx × 2ⁿ. Some o viés do formato a n (127 para FP32, 1023 para FP64) e escreva o resultado nos bits do expoente. Descarte o 1 inicial e guarde os 23 (ou 52) bits seguintes da fração como mantissa, arredondando para o par mais próximo no corte. Concatene sinal, expoente e mantissa e agrupe cada 4 bits em um dígito hexadecimal. Para 3.14159 em FP32 isso dá 0 | 10000000 | 10010010000111111010000 → 0x40490FD0 — ou pule a aritmética e deixe este conversor mostrar cada etapa de forma visível.
Meus dados são enviados quando uso este conversor?
Não. Cada conversão roda localmente no seu navegador usando JavaScript puro — aritmética com DataView e BigInt, sem ida e volta a servidor, sem bibliotecas de terceiros. Você pode abrir as ferramentas de desenvolvedor do navegador, observar o painel de rede ficar em silêncio enquanto digita, ou desconectar completamente da internet e continuar convertendo. O botão Copiar link codifica o padrão de bits no fragmento da URL, que igualmente nunca é enviado a servidor algum.

Ferramentas relacionadas

Ver todas as ferramentas →