Para maior clareza, se estou usando uma linguagem que implementa IEE 754 floats e declaro:
float f0 = 0.f;
float f1 = 1.f;
... e depois imprimi-los novamente, receberei 0,0000 e 1,0000 - exatamente.
Mas o IEEE 754 não é capaz de representar todos os números ao longo da linha real. Perto de zero, as 'lacunas' são pequenas; à medida que você se afasta, as lacunas aumentam.
Então, minha pergunta é: para um flutuador IEEE 754, que é o primeiro inteiro (mais próximo de zero) que não pode ser representado exatamente? Por enquanto, só estou realmente preocupado com flutuadores de 32 bits, embora eu esteja interessado em ouvir a resposta de 64 bits, se alguém der!
Eu pensei que isso seria tão simples quanto calcular 2 bits_de_mantissa e adicionar 1, onde bits_of_mantissa é quantos bits o padrão expõe. Eu fiz isso para carros alegóricos de 32 bits na minha máquina (MSVC ++, Win64), e parecia bom.
fonte
Respostas:
2 bits de mantissa + 1 + 1
O +1 no expoente (mantissa bits + 1) é porque, se a mantissa contém
abcdef...
o número que representa1.abcdef... × 2^e
, na verdade , fornecendo um bit implícito extra de precisão.Portanto, o primeiro número inteiro que não pode ser representado com precisão e será arredondado é:
Para
float
, 16.777.217 (2 24 + 1).Para
double
, 9.007.199.254.740.993 (2 53 + 1).fonte
float
e defini-o como 16.777.217. Mas quando imprimicout
, resultou em 16.777.216. Estou usandoC++
. Por que não consigo obter 16.777.217?(1 << std::numeric_limits<float>::digits) + 1
, e em C(1 << FLT_MANT_DIG) + 1
,. O primeiro é bom porque pode fazer parte de um modelo. Não adicione o +1 se quiser apenas o maior número inteiro representável.O maior valor representável por um número inteiro de n bits é 2 n -1. Como observado acima, a
float
tem 24 bits de precisão no significado e parece implicar que 2 24 não se encaixaria.No entanto .
Potências de 2 dentro do intervalo do expoente são exatamente representáveis como 1,0 × 2 n , então 2 24 pode caber e, consequentemente, o primeiro número inteiro não representável
float
é 2 24 +1. Como observado acima. Novamente.fonte