FreeToGenerate.com

Os bits, e o valor exato por baixo deles. Nada é enviado.

Digite como você escreveria no código. Tudo abaixo é o que a máquina guarda de verdade.

O que são um número de JavaScript, um número de JSON, uma célula de planilha e um double de C.

Experimente

Os bits

0011111110111001100110011001100110011001100110011001100110011010
Sinal
1
Expoente
11
Fração
52

Hex: 3fb999999999999a

Tipo: Normal: há um 1 inicial implícito que não é armazenado.

O que fica armazenado de fato

Não é uma versão arredondada. É o valor exato, porque uma fração binária sempre termina em decimal.

Valor exato armazenado

0.1000000000000000055511151231257827021181583404541015625

56 dígitos

Seu número não é armazenado exatamente. O valor acima é o que você recebeu no lugar.

Você digitou
0.1
Aparece como
0.1

De onde isso vem

7205759403792794 × 2-56

O significando é um inteiro e o expoente é uma potência inteira de dois, então o valor é exato por construção: nenhum cálculo em ponto flutuante entra nisso.

Os valores mais próximos

Os valores representáveis não são igualmente espaçados. Estes são o imediatamente anterior e o seguinte, e entre eles não existe nada.

O anterior
0.09999999999999999
O próximo
0.10000000000000002
Salto até o próximo
1.3877787807814457e-17

Também disponível em: English · Español · Français · العربية

Conversor de ponto flutuante IEEE 754

Veja o sinal, o expoente e a mantissa de qualquer número, e o valor decimal exato que a máquina guarda em vez do arredondado que ela imprime.

O que é IEEE 754

IEEE 754 é o padrão que diz como os computadores guardam números com casas decimais. Quase tudo usa: um número de JavaScript, um número de JSON, uma célula de planilha, um double de C, um float de banco de dados. O layout são três campos num número fixo de bits — um bit de sinal, depois um expoente, depois uma fração — e o valor que eles codificam é a fração multiplicada por dois elevado ao expoente.

Como o expoente é uma potência de dois, o formato só consegue guardar frações cujo denominador seja uma potência de dois. Meio, um quarto, um oitavo: exatos. Um décimo: não, do mesmo jeito que um terço não tem expansão decimal exata. Então o número que você digitou e o que a máquina guardou geralmente não são o mesmo número, e a diferença entre eles é o que esta página mostra.

A parte que quase nenhuma ferramenta mostra é o valor exato. Programas imprimem números de ponto flutuante usando o menor decimal que seria relido como aquele mesmo valor, então 0,1 aparece como 0,1 e parece certo. O valor realmente armazenado é 0,1000000000000000055511151231257827021181583404541015625. Isso não é um arredondamento do valor guardado — é o valor guardado, escrito por extenso.

Como usar

  1. Digite um número. Qualquer coisa que você escreveria no código, incluindo notação exponencial como 5e-324. Os botões cobrem os casos que mostram algo interessante.
  2. Leia os bits. Sinal, expoente e fração vêm em cores separadas, com o hexadecimal embaixo. O painel seguinte diz se o valor é normal, subnormal, zero, infinito ou NaN.
  3. Compare o que você digitou com o que fica guardado. O valor decimal exato aparece por inteiro, com uma nota dizendo se o seu número sobreviveu. Mude para 32 bits para ver o mesmo número guardado na metade dos bits.

Por que 0,1 + 0,2 não dá 0,3

É o exemplo que todo mundo encontra primeiro, e a explicação de sempre — ponto flutuante é impreciso — é verdadeira mas para um passo antes. O interessante é que os três números já estão errados antes de qualquer soma. Guardados como doubles, 0,1 fica um pouco acima de um décimo, 0,2 um pouco acima de um quinto, e 0,3 um pouco abaixo de três décimos. Digite cada um na ferramenta acima e dá para ler os três.

Some os dois primeiros e o resultado exato é 0,3000000000000000444089209850062616169452667236328125. O double mais próximo de três décimos é outro valor, e não é que estejam só perto: são adjacentes. Entre eles não existe nenhum número representável, então a soma erra pela menor quantidade que o formato consegue expressar naquela magnitude, e isso basta para a comparação dar falso.

O mesmo mecanismo explica o conselho sobre dinheiro que você provavelmente já ouviu. Não sobrevive nada cujo denominador carregue um fator cinco — um décimo, um centavo, um quinto —, que é toda quantia em dinheiro que alguém escreve. É também por isso que comparar dois números de ponto flutuante por igualdade é pouco confiável em geral, enquanto comparar um meio ou um quarto é perfeitamente seguro.

O que isso deixa à vista

Inteiros são exatos até certo ponto e aí param. Todo número inteiro é guardado perfeitamente até dois elevado a cinquenta e três; o inteiro seguinte, 9007199254740993, não tem representação e cai em cima do vizinho, então um programa lidando com identificadores grandes pode fundir dois em silêncio. Digite acima e a ferramenta devolve 9007199254740992. Em 32 bits o teto é bem mais baixo: 16777217 já não cabe, e volta como 16777216.

Os valores não são igualmente espaçados. O salto entre vizinhos dobra a cada potência de dois: é cerca de dois vezes dez elevado a menos dezesseis perto de 1, exatamente 1 em dois elevado a cinquenta e dois, e exatamente 2 logo acima, o que é outra forma de dizer que os inteiros ímpares deixam de existir. Entre 1 e 2 existem dois elevado a cinquenta e dois valores distintos; entre 2 e 4 existem os mesmos, espalhados pelo dobro da distância.

Números muito pequenos mudam de comportamento em vez de sumir. Abaixo do menor valor normal o formato larga o 1 inicial implícito e deixa a precisão degradar aos poucos em vez de pular para zero. São os números subnormais, e o menor é dois elevado a menos 1074, cujo valor decimal exato tem 1076 caracteres — que a ferramenta imprime sem reclamar.

E existem dois zeros. O zero negativo tem o próprio padrão de bits, compara igual ao positivo, e ainda assim se distingue: dividir um por ele dá menos infinito. O painel de bits mostra a diferença que o teste de igualdade esconde.

Como isto foi conferido e o que não cobre

Os valores decimais exatos são calculados só com aritmética inteira: nenhum ponto flutuante entra na descrição do ponto flutuante, o que seria circular. Um valor guardado é um significando inteiro multiplicado por uma potência de dois, e multiplicar em cima e embaixo pela potência de cinco correspondente transforma isso num decimal que termina, então a expansão é sempre finita e sempre exata.

Cada padrão de bits e cada valor exato foi conferido contra a biblioteca padrão do Python sobre mais de dois mil números cobrindo toda a faixa, incluindo subnormais, os dois zeros, os dois infinitos e os extremos. O módulo decimal do Python dá o valor exato de um double, e não uma aproximação, o que faz dele um oráculo exato e não apenas independente.

O que não faz: cobre doubles de 64 bits e floats de 32, não os formatos de 16 e 128 bits nem as codificações decimais que o padrão também define. Mostra o arredondamento para o mais próximo, que é o padrão em toda parte e o único que quase toda linguagem expõe. E não diz nada sobre as cargas de NaN: um NaN carrega bits que podem variar entre operações, mas nada portável depende deles, então a ferramenta só informa que o valor não é um número.

Se o que você quer é a expansão binária exata do decimal que digitou, e não a do valor armazenado, isso é outra pergunta e quem responde é o nosso conversor de bases: ele mostra um décimo como uma fração binária que se repete infinitamente. A diferença entre aquela expansão infinita e a finita daqui é justamente o erro de representação.

Por que é grátis?

É aritmética com inteiros, rodando no seu navegador. Não há nada para rodar num servidor, então não há o que cobrar nem conta a criar.

Nada do que você digita é enviado, guardado ou registrado. A entrada é um número, e ela nunca sai da aba.