IEEE 754 double型に精度を落とさずに保存できる最大の「浮動しない」整数は何ですか?
精度を失うことなくdoubleに格納できる最大/最大整数は、doubleの可能な最大値と同じです。つまり、DBL_MAX
または約1.8×10308 (doubleがIEEE 754 64ビットdoubleの場合)。整数です。正確に表現されています。さらに何が欲しいですか?
さらに、最大の整数が何であるかを尋ねてください。精度を損なうことなくおよびすべてのより小さい整数をIEEE 64ビットdoubleに格納できます。 IEEE 64ビットdoubleには52ビットの仮数があるため、253:
または、別の見方:バイアスが指数から取り除かれ、符号ビットを質問とは無関係であると無視すると、doubleによって格納される値は2の累乗に加えて52ビット整数に2を掛けた値になります指数− 52。したがって、指数52を使用すると、2からのすべての値を格納できます52 2まで53− 1.次に、指数53を使用して、2の後に保存できる次の数値53 253 + 1×253 − 52。そのため、2で最初に精度が失われます53 + 1。
9007199254740992(保証なしで9,007,199,254,740,992です):)
プログラム
#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
ウィキペディアには、同じコンテキストで IEEE 754 :
一般的なコンピューターシステムでは、「倍精度」(64ビット)の2進浮動小数点数の係数は53ビット(そのうちの1つが暗黙指定されます)、指数が11ビット、符号ビットが1つです。
2 ^ 53は9 * 10 ^ 15を少し超えています。
IEEE 754 double(64ビット)で表現できる最大の整数は、その型自体が整数であるため、型が表現できる最大の値と同じです。
これは0x7FEFFFFFFFFFFFFF
として表され、次のもので構成されます。
0x7FE
(NaN
または無限大を示す2047)ではなく、最大の指数0x7FF
(バイアスを差し引いた後の1023を表す2046)。0xFFFFFFFFFFFFF
は52ビットすべて1です。バイナリでは、値は暗黙的な1の後に仮数部からさらに52の1が続き、指数から971個のゼロ(1023-52 = 971)が続きます。
正確な10進数値は次のとおりです。
179769313486231570814527423731704356798070567525844996598917476803157260780028538760760558558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723881878177919192334827479782620414472388187818491919491924
これは約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
DECIMAL_Dig
の<float.h>
は、少なくとも妥当な近似値を提供する必要があります。これは10進数を扱うため、実際にはバイナリで格納されるため、精度を落とすことなくlittleより大きい値を格納できますが、正確にどれだけ言うのかはわかりません。 FLT_RADIX
とDBL_MANT_Dig
から理解できるはずですが、結果を完全に信頼できるかどうかはわかりません。