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.
| Sinal | |
| Expoente | |
| Mantissa |
- Você digitou
- Realmente armazenado
- Erro de arredondamento
- Anterior
- Próximo
- ULP (tamanho do intervalo)
| Formato | Total de bits | Sinal | Expoente | Mantissa | Viés | Valor finito máximo | Dígitos decimais |
|---|---|---|---|---|---|---|---|
| binary16 (FP16) | 16 | 1 | 5 | 10 | 15 | 65504 | ~3.3 |
| bfloat16 | 16 | 1 | 8 | 7 | 127 | ≈3.39×10³⁸ | ~2.3 |
| binary32 (FP32) | 32 | 1 | 8 | 23 | 127 | ≈3.40×10³⁸ | ~7.2 |
| binary64 (FP64) | 64 | 1 | 11 | 52 | 1023 | ≈1.80×10³⁰⁸ | ~15.9 |
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
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
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
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
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
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.
print(0.1) # 0.1 — parece exato, não é
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.
if (0.1 + 0.2 === 0.3) { … } // nunca executa 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.
fp16(65520) → Infinity (0x7C00) — estouro silencioso
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.
if (x === NaN) { … } // sempre falso, mesmo quando x É NaN 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?
O que é IEEE 754?
Qual é a diferença entre FP16 e bfloat16?
O que são números subnormais (denormais)?
Devo usar float ou double?
Como converter um float para hex manualmente?
Meus dados são enviados quando uso este conversor?
Ferramentas relacionadas
Ver todas as ferramentas →Conversor de Base Numérica — Binário, Hex, Decimal e Octal
Ferramentas de Conversão
Converta números entre binário, hexadecimal, decimal, octal e qualquer base personalizada (2-36) instantaneamente. Gratuito, privado, sem cadastro — todo o processamento acontece no seu navegador.
Conversor de Cores — HEX, RGB, HSL e OKLCH
Ferramentas de Conversão
Converta HEX para RGB, HSL, OKLCH, OKLAB e CMYK no seu navegador — copie qualquer formato com um clique. Grátis, sem cadastro, suas cores nunca saem da página.
Conversor de HEX para CMYK
Ferramentas de Conversão
Converta cores HEX para CMYK no seu navegador. Aproximação ingênua baseada em sRGB para prévias de impressão. Grátis, sem cadastro, suas cores ficam locais.
Conversor de HEX para HSL
Ferramentas de Conversão
Converta qualquer cor hex para HSL no seu navegador — hex de 3, 6 e 8 dígitos com alfa, todos suportados. Grátis, instantâneo, sem cadastro, suas cores nunca saem da página.
Conversor de HEX para OKLCH
Ferramentas de Conversão
Converta HEX para OKLCH para tokens de design do Tailwind v4. Saída perceptualmente uniforme ao vivo com avisos de gama Display P3. Grátis, apenas no navegador.
Conversor de HEX para RGB
Ferramentas de Conversão
Converta qualquer código de cor HEX para RGB no seu navegador — hex de 3, 6 e 8 dígitos com alfa, todos suportados. Grátis, instantâneo, sem cadastro, suas cores nunca saem da página.