4

単精度浮動小数点数の精度が 7 桁 (または倍精度の 15 ~ 16 桁) になるのはなぜですか?

float(Sign(32) Exponent(30-23), Fraction (22-0)) に割り当てられた 32 ビットに基づいて、どのように到達するのか説明してもらえますか?

4

2 に答える 2

10

仮数部の小数部の 23 ビット (22-0) がメモリ形式に表示されますが、先頭に 1 があると仮定しているため、合計精度は実際には 24 ビットです。これはlog10(2^24) ≈ 7.22510 進数に相当します。

倍精度浮動小数点数の小数部は 52 ビットで、先頭の 1 は 53 です。したがって、double はlog10(2^53) ≈ 15.95516 桁ではなく、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 ドル以上が不足しています。

于 2013-10-02T05:20:00.813 に答える