単精度浮動小数点数の精度が 7 桁 (または倍精度の 15 ~ 16 桁) になるのはなぜですか?
float(Sign(32) Exponent(30-23), Fraction (22-0)) に割り当てられた 32 ビットに基づいて、どのように到達するのか説明してもらえますか?
単精度浮動小数点数の精度が 7 桁 (または倍精度の 15 ~ 16 桁) になるのはなぜですか?
float(Sign(32) Exponent(30-23), Fraction (22-0)) に割り当てられた 32 ビットに基づいて、どのように到達するのか説明してもらえますか?
仮数部の小数部の 23 ビット (22-0) がメモリ形式に表示されますが、先頭に 1 があると仮定しているため、合計精度は実際には 24 ビットです。これはlog10(2^24) ≈ 7.225
10 進数に相当します。
倍精度浮動小数点数の小数部は 52 ビットで、先頭の 1 は 53 です。したがって、double はlog10(2^53) ≈ 15.955
16 桁ではなく、10 進数を保持できます。
注: 先頭の 1 は符号ビットではありません。実際にはそうです(-1)^sign * 1.ffffffff * 2^(eeee-constant)
が、先頭の 1 を分数に格納する必要はありません。符号ビットは引き続き保存する必要があります
1/9 のように、2 のべき乗の合計として表すことができない数があります。
>>>> double d = 0.111111111111111;
>>>> System.out.println(d + "\n" + d*10);
0.111111111111111
1.1111111111111098
金融プログラムが自己修正せずにこの計算を何度も行うと、最終的に不一致が生じるでしょう。
>>>> double d = 0.111111111111111;
>>>> double sum = 0;
>>>> for(int i=0; i<1000000000; i++) {sum+=d;}
>>>> System.out.println(sum);
111111108.91914201
10 億回の合計の後、2 ドル以上が不足しています。