Numexa logoNumexa

Conversor IEEE 754

Veja como o computador guarda números com vírgula, bit a bit.

Precisão simples (float, 32 bits)

00111101110011001100110011001101

Sinal: 0 (positivo)
Expoente (8 bits): 123 − 127 = -4
Mantissa: 23 bits

Hex: 0x3DCCCCCD

Valor realmente armazenado: 0.100000001490116119384765625

Precisão dupla (double, 64 bits)

0011111110111001100110011001100110011001100110011001100110011010

Sinal: 0 (positivo)
Expoente (11 bits): 1019 − 1023 = -4
Mantissa: 52 bits

Hex: 0x3FB999999999999A

Valor realmente armazenado: 0.1000000000000000055511151231257827021181583404541015625

O conversor IEEE 754 mostra exatamente como um número decimal é armazenado em ponto flutuante de 32 bits (float) e 64 bits (double): bit de sinal, expoente e mantissa, além do valor real guardado na memória, que quase nunca é igual ao que você digitou.

O Famoso 0.1 + 0.2

> 0.1 + 0.2
0.30000000000000004

> 0.1 + 0.2 === 0.3
false

Digite 0.1 na calculadora e veja o valor armazenado: não é 0,1. Isso acontece em JavaScript, Python, Java, C e qualquer linguagem que use IEEE 754. Não é bug: é a consequência de representar frações decimais em base 2.

Fórmula do IEEE 754

valor = (−1)^sinal × 1.mantissa × 2^(expoente − viés)

float  (32 bits): 1 sinal | 8 expoente  | 23 mantissa | viés 127
double (64 bits): 1 sinal | 11 expoente | 52 mantissa | viés 1023

Exemplo: −6,25 em Float

  1. Sinal negativo: bit de sinal = 1.
  2. 6,25 em binário = 110,01 = 1,1001 × 2².
  3. Expoente: 2 + 127 = 129 = 10000001.
  4. Mantissa (sem o 1 inicial): 1001 seguido de zeros.
  5. Resultado: 1 10000001 10010000000000000000000 = 0xC0C80000.

Casos Especiais

  • Zero: expoente e mantissa zerados (existe +0 e −0).
  • Infinito: expoente com todos os bits 1 e mantissa zero.
  • NaN: expoente com todos os bits 1 e mantissa diferente de zero.
  • Subnormais: expoente zero e mantissa diferente de zero, para números muito próximos de zero.

Perguntas Frequentes

Por que 0.1 + 0.2 não é igual a 0.3?

Porque 0,1 não tem representação exata em binário, assim como 1/3 não tem em decimal. O computador guarda o double mais próximo, que é 0,1000000000000000055511151231257827. Somando os erros de 0,1 e 0,2, o resultado vira 0,30000000000000004.

Como é dividido um float de 32 bits?

1 bit de sinal, 8 bits de expoente (com viés de 127) e 23 bits de mantissa. O valor é (−1)^sinal × 1,mantissa × 2^(expoente − 127). O double de 64 bits usa 1, 11 e 52 bits, com viés de 1023.

Qual a diferença entre float e double?

Float (precisão simples) tem 32 bits e cerca de 7 dígitos decimais de precisão. Double (precisão dupla) tem 64 bits e cerca de 15 a 17 dígitos. JavaScript usa sempre double; C, Java e C# têm os dois tipos.

Como comparar números de ponto flutuante corretamente?

Nunca use igualdade direta. Compare se a diferença absoluta é menor que uma tolerância: Math.abs(a − b) < 1e-9. Para dinheiro, use inteiros (centavos) ou tipos decimais, como BigDecimal no Java.

Ferramentas Relacionadas