문제

정밀도를 잃지 않고 IEEE 754 이중 유형에 저장할 수있는 가장 큰 "플로팅"정수는 무엇입니까?

도움이 되었습니까?

해결책

정밀도를 잃지 않고 더블로 저장할 수있는 가장 크고 가장 큰 정수는 더블의 가장 큰 값과 동일합니다. 그건, DBL_MAX 또는 약 1.8 × 10308 (이중이 IEEE 754 64 비트 더블 인 경우). 정수입니다. 정확히 표현됩니다. 당신은 무엇을 더 원하십니까?

계속해서, 가장 큰 정수가 무엇인지 물어봐 그리고 모든 작은 정수 정밀도를 잃지 않고 IEEE 64 비트 복식에 저장할 수 있습니다. IEEE 64 비트 더블에는 52 비트의 Mantissa가 있으므로 2라고 생각합니다.53:

  • 253 + 1은 처음에 1이고 끝에 1은 너무 많은 0이 있기 때문에 저장할 수 없습니다.
  • 2 미만53 Mantissa에 명시 적으로 저장된 52 비트로 저장 한 다음 사실상 다른 지수를 제공 할 수 있습니다.
  • 253 작은 힘 2의 힘이기 때문에 분명히 저장 될 수 있습니다.

또는 그것을 살펴 보는 또 다른 방법 : 편견이 지수에서 벗어나고 질문과 관련이없는 부호 비트를 무시하면 더블에 의해 저장된 값은 2의 힘과 52 비트 정수가 2를 곱한 52 비트 정수입니다.지수 -52. 따라서 지수 52를 사용하면 2에서 모든 값을 저장할 수 있습니다.52 2까지53- 1. 그런 다음 지수 53을 사용하면 2 후에 저장할 수있는 다음 번호입니다.53 2입니다53 + 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

Wikipedia는 다음과 같은 맥락에서 IEEE 754:

일반적인 컴퓨터 시스템에서 '이중 정밀도'(64 비트) 이진 부동 소수점 수는 53 비트 (그 중 하나가 암시됨), 11 비트의 지수 및 1 개의 부호 비트의 계수를 갖습니다.

2^53은 9 * 10^15를 초과합니다.

IEEE 754 더블 (64 비트)으로 표현할 수있는 가장 큰 정수는 그 값 자체가 정수이기 때문에 유형이 나타내는 가장 큰 값과 동일합니다.

이것은 다음으로 표시됩니다 0x7FEFFFFFFFFFFFFF, 이는 다음으로 구성됩니다.

  • 부호 비트 0 (긍정적) 1이 아닌 (음수)
  • 최대 지수 0x7FE (바이어스가 빼면 1023을 나타내는 2046) 0x7FF (2047은 a NaN 또는 무한대).
  • 최대 만티사 0xFFFFFFFFFFFFF 52 비트 모두 1입니다.

바이너리에서, 값은 암시 적 1이고, Mantissa의 또 다른 52 개, 지수에서 971 0 (1023-52 = 971)이 뒤 따릅니다.

정확한 소수점 값은 다음과 같습니다.

179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368

이것은 약 1.8 x 10입니다308.

Mantissa의 크기를 봐야합니다. IEEE 754 64 비트 플로팅 포인트 번호 (52 비트, 1 묵시적)는 절대 값이 2^53 이상인 정수를 정확하게 나타낼 수 있습니다.

DECIMAL_DIG ~에서 <float.h> 적어도 합리적인 근사치를 제공해야합니다. 그것은 십진수를 다루고 실제로 바이너리에 저장되므로 아마도 무언가를 보관할 수 있습니다. 작은 정밀도를 잃지 않고 더 크지 만 말하기가 얼마나 어렵습니다. 나는 당신이 그것을 알아낼 수 있어야한다고 생각합니다. FLT_RADIX 그리고 DBL_MANT_DIG, 그러나 결과를 완전히 신뢰할 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top