0

Visualizador de Floats IEEE-754

Vê exatamente como um número decimal é armazenado como float IEEE-754 — bit de sinal, bits do expoente e bits da mantissa — e porque é que números como 0,1 não são armazenados exatamente.

🔒 Processado inteiramente em seu navegador – nada que você digita aqui é carregado.

A processar... 0%
A normalizar
A calcular o viés do expoente
A expandir os bits da mantissa
Concluído

Resultado

Todos os números de vírgula flutuante que um computador armazena — um número JavaScript, um float em C, um float em Python — são codificados da mesma forma segundo a norma IEEE 754: um bit de sinal, um bloco de bits do expoente e um bloco de bits da mantissa (fração). A precisão simples (32 bits) usa 1 bit de sinal, 8 bits de expoente e 23 bits de mantissa; a precisão dupla (64 bits), o formato por trás do tipo numérico padrão em quase todas as linguagens, usa 1 bit de sinal, 11 bits de expoente e 52 bits de mantissa. Esta ferramenta pega em qualquer número decimal que introduzas, codifica-o em qualquer das larguras usando o codificador de floats DataView/ArrayBuffer do navegador — a mesma máquina em que o teu código realmente corre — e pinta cada bit com a cor da região a que pertence.

A codificação segue três passos, e esta ferramenta percorre-os todos em vez de mostrar apenas os bits finais. Primeiro, a normalização: o número é reescrito como 1.mantissa × 2^expoente, com exatamente um dígito diferente de zero antes da vírgula binária (os números demasiado pequenos recebem o tratamento subnormal, sem o 1 implícito à cabeça). Segundo, viés do expoente: como o campo do expoente tem de guardar expoentes positivos e negativos como um número sem sinal, um viés fixo (127 para precisão simples, 1023 para dupla) é adicionado antes de o campo ser escrito em binário. Terceiro, a mantissa fracionária é expandida bit a bit pelo método clássico de «multiplicar por dois, tomar a parte inteira como próximo bit, guardar o resto» — repetido até o campo da mantissa estar cheio, altura em que os bits restantes determinam se o resultado arredonda para cima ou para baixo (arredondamento para o par mais próximo, o padrão do IEEE-754).

É exatamente por isso que um número tão comum como 0,1 não é armazenado exatamente. Em binário, 0,1 é uma fração periódica (0,0001100110011… infinitamente), por isso nenhuma mantissa finita o consegue guardar com precisão — tem de ser arredondado algures. Codifica 0,1 como float de 32 bits e lê os bits de volta: não recebes 0,1, mas sim exatamente 0,100000001490116119384765625. A precisão dupla tem mais 29 bits de mantissa para trabalhar, por isso o erro de arredondamento é muito menor, mas também não é zero — 0,1 como double de 64 bits é exatamente 0,1000000000000000055511151231257827021181583404541015625. Esta ferramenta calcula esse valor exato armazenado com aritmética de inteiros grandes (sem atalhos de vírgula flutuante), para que a diferença entre o que escreveste e o que o hardware realmente guarda nunca seja escondida ou aproximada.

Os valores especiais recebem padrões de bits exatos e reservados, em vez de uma codificação normal: zero e zero negativo têm todos os bits do expoente e da mantissa a zero (apenas o bit de sinal difere), ±Infinito tem todos os bits do expoente a um e a mantissa a zero, e NaN tem todos os bits do expoente a um e pelo menos um bit da mantissa ativo. Tudo corre localmente no teu navegador — nada do que escreves é enviado para lado nenhum — o que faz deste um local seguro para ganhares intuição real sobre bugs de vírgula flutuante: porque é que `0.1 + 0.2 !== 0.3` em quase todas as linguagens, porque é que texturas float32 em código gráfico perdem precisão que float64 manteria, e porque é que código financeiro deve, em geral, evitar completamente a vírgula flutuante binária.