web-dev-qa-db-ja.com

doubleに格納できる最大の整数

IEEE 754 double型に精度を落とさずに保存できる最大の「浮動しない」整数は何ですか?

200

精度を失うことなくdoubleに格納できる最大/最大整数は、doubleの可能な最大値と同じです。つまり、DBL_MAXまたは約1.8×10308 (doubleがIEEE 754 64ビットdoubleの場合)。整数です。正確に表現されています。さらに何が欲しいですか?

さらに、最大の整数が何であるかを尋ねてください。精度を損なうことなくおよびすべてのより小さい整数をIEEE 64ビットdoubleに格納できます。 IEEE 64ビットdoubleには52ビットの仮数があるため、253

  • 253 + 1は保存できません。開始の1と終了の1の間にゼロが多すぎるためです。
  • 2未満53 52ビットを仮数部に明示的に保存し、その後、実際に指数を使用して別の指数を取得することができます。
  • 253 明らかに2のべき乗であるため、保存できます。

または、別の見方:バイアスが指数から取り除かれ、符号ビットを質問とは無関係であると無視すると、doubleによって格納される値は2の累乗に加えて52ビット整数に2を掛けた値になります指数− 52。したがって、指数52を使用すると、2からのすべての値を格納できます52 2まで53− 1.次に、指数53を使用して、2の後に保存できる次の数値53 253 + 1×253 − 52。そのため、2で最初に精度が失われます53 + 1。

460
Steve Jessop

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 
68
pmg

ウィキペディアには、同じコンテキストで IEEE 754

一般的なコンピューターシステムでは、「倍精度」(64ビット)の2進浮動小数点数の係数は53ビット(そのうちの1つが暗黙指定されます)、指数が11ビット、符号ビットが1つです。

2 ^ 53は9 * 10 ^ 15を少し超えています。

25
Carl Smotricz

IEEE 754 double(64ビット)で表現できる最大の整数は、その型自体が整数であるため、型が表現できる最大の値と同じです。

これは0x7FEFFFFFFFFFFFFFとして表され、次のもので構成されます。

  • 1(負)ではなく、符号ビット0(正)
  • 0x7FENaNまたは無限大を示す2047)ではなく、最大の指数0x7FF(バイアスを差し引いた後の1023を表す2046)。
  • 最大仮数0xFFFFFFFFFFFFFは52ビットすべて1です。

バイナリでは、値は暗黙的な1の後に仮数部からさらに52の1が続き、指数から971個のゼロ(1023-52 = 971)が続きます。

正確な10進数値は次のとおりです。

179769313486231570814527423731704356798070567525844996598917476803157260780028538760760558558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723881878177919192334827479782620414472388187818491919491924

これは約1.8 x 10です308

13
Simon Biber

仮数のサイズを確認する必要があります。 IEEE 754 64ビット浮動小数点数(52ビットに1を加えたもの)は、絶対値が2 ^ 53以下の整数を正確に表すことができます。

8
Dolphin
6
Jay

DECIMAL_Dig<float.h>は、少なくとも妥当な近似値を提供する必要があります。これは10進数を扱うため、実際にはバイナリで格納されるため、精度を落とすことなくlittleより大きい値を格納できますが、正確にどれだけ言うのかはわかりません。 FLT_RADIXDBL_MANT_Digから理解できるはずですが、結果を完全に信頼できるかどうかはわかりません。

1
Jerry Coffin