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