精度を失うことなくIEEE754倍精度型に格納できる最大の「浮動小数点なし」整数は何ですか?
8 に答える
精度を失うことなくdoubleに格納できる最大/最大の整数は、doubleの可能な最大値と同じです。つまり、DBL_MAX
約1.8×10 308(doubleがIEEE 754 64ビットdoubleの場合)。整数です。正確に表現されています。これ以上何が欲しいですか?
続けて、最大の整数が何であるかを尋ねてください。これにより、整数とすべての小さい整数を、精度を失うことなくIEEE64ビットdoubleに格納できます。IEEE 64ビットdoubleには52ビットの仮数があるので、2 53だと思います:
- 2 53 + 1は、最初の1と最後の1の間にゼロが多すぎるため、保存できません。
- 2 53未満のものはすべて格納でき、52ビットが仮数に明示的に格納され、その後、指数が有効になり、別の指数が得られます。
- 2 53は2の小さな累乗なので、明らかに保存できます。
または別の見方をすると、バイアスが指数から取り除かれ、符号ビットを質問とは無関係であるとして無視すると、doubleによって格納される値は2の累乗に、52ビットの整数に2を掛けたものになります。指数- 52。したがって、指数52を使用すると、252から253までのすべての値を格納できます - 1 。次に、指数53を使用すると、253の後に格納できる次の数値は253 +1× 253−52です。したがって、精度の低下は最初に2 53 +1で発生します。
保証なし:)
プログラム
#include <math.h>
#include <stdio.h>
int main(void) {
double dbl = 0; /* I started with 9007199254000000, a little less than 2^53 */
while (dbl + 1 != dbl) dbl++;
printf("%.0f\n", dbl - 1);
printf("%.0f\n", dbl);
printf("%.0f\n", dbl + 1);
return 0;
}
結果
9007199254740991 9007199254740992 9007199254740992
ウィキペディアは、 IEEE754へのリンクと同じ文脈でこれを言っています:
一般的なコンピュータシステムでは、「倍精度」(64ビット)の2進浮動小数点数は、53ビットの係数(そのうちの1つは暗黙的)、11ビットの指数、および1つの符号ビットを持ちます。
2^53は9*10^15を少し超えています。
IEEE 754 double (64 ビット) で表現できる最大の整数は、その値自体が整数であるため、型が表現できる最大の値と同じです。
これは として表され0x7FEFFFFFFFFFFFFF
、次のもので構成されます。
- 符号ビット 1 (負) ではなく 0 (正)
- (aまたは無限大を示す 2047
0x7FE
) ではなく、最大指数(バイアスを減算した後の 1023 を表す 2046)。0x7FF
NaN
0xFFFFFFFFFFFFF
52 ビットすべて 1 である最大仮数。
2 進数では、値は暗黙の 1 であり、その後に仮数から 52 個の 1 が続き、次に指数から 971 個のゼロ (1023 - 52 = 971) が続きます。
正確な 10 進数値は次のとおりです。
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
これは約 1.8 x 10 308です。
仮数のサイズを確認する必要があります。IEEE 754 64ビット浮動小数点数(52ビットに1を加えたもの)は、絶対値が2^53以下の整数を正確に表すことができます。
1.7976931348623157×10^308
http://en.wikipedia.org/wiki/Double_precision_floating-point_format
確かに、64 ビット IEEE754 double の場合、9007199254740992 == 2^53 までのすべての整数を正確に表すことができます。
ただし、4503599627370496 == 2^52 を超える表現可能な数値はすべて整数であることにも注意してください。2^52 を超えると、それらが整数であるかどうかをテストする意味がなくなります。それらはすべて、表現可能な値に近い値に暗黙的に丸められるためです。
2^51 から 2^52 の範囲では、整数以外の値は ".5" で終わる中間点のみです。つまり、計算後の整数テストでは、少なくとも 50% の誤答が予想される必要があります。
2^51 の下には ".25" と ".75" もあります。そのため、数値を丸めた対応する数値と比較して、整数であるかどうかを判断することは、ある程度の意味を持ち始めます。
TLDR: 計算結果が整数であるかどうかをテストする場合は、2251799813685248 == 2^51 より大きい数値は避けてください