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.