15

IEEE 754 の double と float を扱っているときはいつでも、特に小数点以下の桁数が多い数値を表現しようとすると、表現できない数値があることに気付きました。これはよく理解されていますが、double (または float) の MIN/MAX 範囲内に表現できない整数があり、表現可能な最も近い IEEE 754 表現に丸める必要があるかどうかに興味がありましたか?

たとえば、非常に大きな数は、たとえそれが整数であっても、double または float で表現されることがあります。明らかに、まっすぐな int64 またはそのような大きな整数データ型を使用する方が良いでしょうが、それでもなお、大きな数値に対して double を使用することがよくあります。

表現できないと言える数字はありますか、それとも問題にならない数学的理由を教えていただけますか?

4

1 に答える 1

28

確かに、倍精度浮動小数点として表現できない整数があります。

Pow(2, 53)または9007199254740992を超えないすべての整数表現可能です。から(つまり)Pow(2, 53)まで、偶数のみが表現可能です。奇数は四捨五入されます。Pow(2, 54)18014398509481984

もちろんそのまま継続。からPow(2, 54)までPow(2, 55)は 4 の倍数 (4 で割り切れる整数) のみ、 からPow(2, 55)までPow(2, 56)は 8 の倍数のみ、などです。

これは、倍精度浮動小数点形式の仮数 (仮数) が 53 ビット (2 進数) であるためです。

私の主張を確認するのは簡単です。たとえば、数値10000000000000001integer64. に変換してからdoubleに戻しinteger64ます。精度の低下が見られます。

非常に大きな倍精度数を使用する場合、整数全体のごくわずかな割合しか表現できません。たとえば、1E+300( と の間Pow(2, 996)の)近くで、 ( )Pow(2, 997)の倍数を話しています。これは、aが約 16 桁まで正確であるという事実と一致しています。したがって、300 桁の整数は、最初の約 1 桁だけが「記憶」されます。16 桁 (実際には 53 の 2 進数)。Pow(2, 944)1.4870169084777831E+284double


追加: 正確に表現できない 10 の最初の累乗は1E+23(または 100 セクスティリオン、短いスケールの命名スタイル) です。16777216その数の近くでは、 (つまり)の整数倍しかPow(2, 24)表現できませんが、10 の 23 乗は明らかに 2 の倍数の 24 乗ではありません。素因数分解は10**23 == 2**23 * 5**23であるため、必要な 24 回ではなく、23 回だけ 2 で均等に割ることができます。

于 2013-10-20T07:11:29.297 に答える