確かに、倍精度浮動小数点として表現できない整数があります。
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 進数) であるためです。
私の主張を確認するのは簡単です。たとえば、数値10000000000000001
をinteger64
. に変換してからdouble
に戻しinteger64
ます。精度の低下が見られます。
非常に大きな倍精度数を使用する場合、整数全体のごくわずかな割合しか表現できません。たとえば、1E+300
( と の間Pow(2, 996)
の)近くで、 ( )Pow(2, 997)
の倍数を話しています。これは、aが約 16 桁まで正確であるという事実と一致しています。したがって、300 桁の整数は、最初の約 1 桁だけが「記憶」されます。16 桁 (実際には 53 の 2 進数)。Pow(2, 944)
1.4870169084777831E+284
double
追加: 正確に表現できない 10 の最初の累乗は1E+23
(または 100 セクスティリオン、短いスケールの命名スタイル) です。16777216
その数の近くでは、 (つまり)の整数倍しかPow(2, 24)
表現できませんが、10 の 23 乗は明らかに 2 の倍数の 24 乗ではありません。素因数分解は10**23 == 2**23 * 5**23
であるため、必要な 24 回ではなく、23 回だけ 2 で均等に割ることができます。