Por que o flutuador de precisão simples IEEE754 possui precisão de apenas 7 dígitos?

Por que um número de ponto flutuante de precisão simples tem precisão de 7 dígitos (ou precisão de 15 a 16 dígitos)?

Alguém pode explicar como chegamos com base nos 32 bits atribuídos para float (sinal (32) expoente (30-23), fração (22-0))?

23 bits de fração (22-0) do significando aparecem no formato de memory, mas a precisão total é na verdade de 24 bits, uma vez que assumimos que há um 1. inicial. Isso é equivalente a log10(2^24) ≈ 7.225 dígitos decimais.

O float de precisão dupla tem 52 bits em fração, mais o 1 inicial é 53. Portanto, um double pode conter log10(2^53) ≈ 15.955 dígitos decimais, não exatamente 16.

Nota: O primeiro 1 não é um bit de sinal. Na verdade, é (-1)^sign * 1.ffffffff * 2^(eeee-constant) mas não precisamos armazenar o primeiro 1 na fração. O bit de sinal ainda deve ser armazenado


Existem alguns números que não podem ser representados como uma sum de potências de 2, como 1/9:

 >>>> double d = 0.111111111111111; >>>> System.out.println(d + "\n" + d*10); 0.111111111111111 1.1111111111111098 

Se um programa financeiro fizesse esse cálculo várias vezes sem se corrigir, haveria eventualmente discrepâncias.

 >>>> double d = 0.111111111111111; >>>> double sum = 0; >>>> for(int i=0; i<1000000000; i++) {sum+=d;} >>>> System.out.println(sum); 111111108.91914201 

Depois de 1 bilhão de summações, estamos perdendo mais de US $ 2.