double에 저장할 수있는 가장 큰 정수


답변:


506

정밀도를 잃지 않고 double에 저장할 수있는 가장 큰 / 가장 큰 정수는 가능한 가장 큰 double 값과 같습니다. 즉, DBL_MAX약 1.8 × 10 308 (더블이 IEEE 754 64 비트 더블 인 경우). 정수입니다. 정확하게 표현되었습니다. 무엇을 더 원하십니까?

계속해서 가장 큰 정수가 무엇인지 물어보십시오 . 정밀도를 잃지 않고 모든 작은 정수 를 IEEE 64 비트 복식에 저장할 수 있습니다. IEEE 64 비트 double에는 52 비트 가수가 있으므로 2 53 이라고 생각합니다 .

  • 시작시 1과 끝 1 사이에 0이 너무 많으므로 2 53 + 1을 저장할 수 없습니다.
  • 가수에 52 비트를 명시 적으로 저장 한 후 2 53 보다 작은 것은 저장할 수 있으며, 지수는 사실상 다른 것을 제공합니다.
  • 2 53 의 작은 거듭 제곱이기 때문에 분명히 53을 저장할 수 있습니다.

또는 그것을 보는 또 다른 방법 : 일단 바이어스가 지수에서 제거되고 질문과 관련이없는 부호 비트를 무시하면 double로 저장된 값은 2의 거듭 제곱에 52의 정수에 2를 곱한 값입니다 지수-52 . 따라서 지수 52를 사용하면 2 52 에서 2 53  − 1 까지의 모든 값을 저장할 수 있습니다 . 그런 다음 지수 53을 사용하면 2 53 이후에 저장할 수있는 다음 숫자 는 2 53 + 1 × 2 53 − 52 입니다. 따라서 정밀도 손실은 2 53 + 1에서 처음 발생합니다 .


126
+1 좋은 직업은 그 질문이 실제로 어떤 사람이 의도 한 것을 의미하지는 않았으며 대답을 모두 제공하는 것 ( "기술적으로 맞음"과 "아마도 예상 됨")을 의미하지 않았다.
Pascal Cuoq 2009

62
또는 "에 대해 장난"내가 그들에게 전화하는 경향 :-) "도와 주려고"
스티브 Jessop

8
나는 조랑말 토니에게 절을한다.
Steve Jessop

11
"모든 작은 정수"를 의미하는 것이 아니라 크기가 같거나 작은 모든 정수를 의미합니다. 2 ^ 53 이하의 음수는 많고 정확하게 double로 표현할 수 없기 때문입니다.
Southern Hospitality

13
나는 더 작은 것을 의미하며, 내가 더 작게 말할 때의 의미는 정확히 :-) -1,000,000이 1보다 작지만 더 작지 않습니다.
Steve Jessop

77

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

7
그것이 '닫기'이지만 2 ^ N보다 작을 것이라고 가정하면, 더 빠른 테스트가 double dbl = 1; while (dbl + 1 != dbl) dbl *= 2; while (dbl == --dbl);동일한 결과를 산출합니다
Seph

4
@Seph 무엇입니까 ...? 아니? while (dbl == --dbl)영원히 반복되거나 전혀 반복되지 않습니다. :) (이 경우 2 ^ N이므로 전혀 아님). 아래에서 접근해야합니다. 또한 while 루프가 dbl을 감소시키기 때문에 한 번의 검사로 인해 예상 결과보다 1이 적습니다. 그리고 왼쪽을 평가하기 전후에 (내가 아는 한 정의되지 않은) 감소가 이루어지면 실행 순서에 달려 있습니다. 전자 인 경우 항상 사실이며 영원히 반복됩니다.
falstro

10
어딘가에 2 ^ 53 = 9,007,199,254,740,992를 나타낼 수도 있습니다.
Xonatron

1
이것으로 논쟁하기가 어렵습니다! 멋진 실험
MattM

사용 while (dbl + 1 != dbl) dbl++;에 대한 약점은 수학을 고려 dbl + 1 != dbl하여 평가할 수 있습니다 . 이것은 무한 루프로 끝날 수 있습니다. long doubleFLT_EVAL_METHOD == 2
chux-복원 Monica Monica

25

Wikipedia는 IEEE 754에 대한 링크와 동일한 컨텍스트에서 다음과 같이 말합니다 .

일반적인 컴퓨터 시스템에서 '배정도'(64 비트) 이진 부동 소수점 수의 계수는 53 비트 (이 중 하나는 암시적임), 지수는 11 비트 및 하나의 부호 비트입니다.

2 ^ 53은 9 * 10 ^ 15 이상입니다.


@Steve Jessop 다소간, 그것은 실제로 내가 말하는 것입니다. 또한 IEEE 호환이 필요한 FPU가없는 하드웨어 시스템을 발견했습니다. 따라서 8 개월 후 여기로 돌아와서 동일한 정보가 필요한 경우 "일반적인 시스템"항목이 실제로 도움이되지 않습니다. 내 68K 기반 마이크로 컨트롤러 (FPU가 없다고 가정 할 때 ... 기억이 나지 않습니다).
San Jacinto

14
@San Jacinto- "이것은 쓸모가 없습니다"는 과도합니다. 대답은 전형적인 컴퓨터 시스템이 실제로 IEEE 754 표기법을 사용한다는 의견을 포함했을 때처럼 유용하지는 않습니다.
Stephen C. Steel

@Stephen C. Steel, 실제로는 정확합니다. 내 시나리오에서 나중에 다시 돌아와서 IEEE 최대를 찾는다면 '일반적인 시스템'이 무엇인지에 대해 모호 할 수는 있지만이 불만 외에는 여전히 대답이 장점입니다.
San Jacinto

20

IEEE 754 double (64 비트)로 표시 될 수있는 가장 큰 정수는 값 자체가 정수이므로 유형이 나타낼 수있는 가장 큰 값과 동일합니다.

이것은로 구성되며 다음과 같이 0x7FEFFFFFFFFFFFFF구성됩니다.

  • 부호 비트 1 (음수)이 아닌 0 (양수)
  • 최대 지수 0x7FE(바이어스를 뺀 후 1023을 나타내는 2046) 0x7FF(2047은 a NaN또는 무한대 를 나타냄 )가 아닙니다 .
  • 최대 가수 0xFFFFFFFFFFFFF는 모두 52 비트입니다.

이진수에서 값은 암시 적 1과 가수에서 다른 52 개의 1이오고 지수에서 971 개의 0 (1023-52 = 971)이됩니다.

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

1797693134862315708145274237317043567980705675258449965989174768031572607800285387605895586327668781715404589535143824642343213268894641827684675467035375169860499105765512820762454900903893289440758685084551339423045832369032229481658013493321233124857979

이것은 대략 1.8 x 10 308 입니다.


연속적으로 표현할 수있는 0과 0 사이의 모든 값으로 나타낼 수있는 가장 큰 값은 어떻습니까?
Aaron Franke

@AaronFranke이 질문은 연속적인 표현에 대해 묻지 않았지만, 다른 질문에 대한 답변은 여기에있는 대부분의 다른 답변에 포함되었거나 실제 답변으로 잘못 제공되었습니다. 2⁵³ (2의 53 승)입니다.
Simon Biber

8

가수의 크기를 봐야합니다. IEEE 754 64 비트 부동 소수점 숫자 (52 비트 및 1을 암시 함)는 2 ^ 53 이하의 절대 값을 갖는 정수를 정확하게 나타낼 수 있습니다.


8
그것은 정확히 :-)도 2 ^ 53을 나타낼 수
스티브 Jessop에게

6

2
이 답변은 인용으로 훨씬 좋습니다.
San Jacinto

2
@Carl 잘, 정수가 왼쪽을 넘어 0을 가지면 정확하게 저장됩니다.
Wilhelm

4
@all you downvoters : 1.7976931348623157 × 10 ^ 308 정확한 정수입니다. 치료 수학 수업이나 다른 것에 참석해야합니까?
Dan Molding

6
우리는이 절망적 인 대답에 대한 토론에서 의미론에 빠져 있습니다. 사실, 그 숫자는 정확하게 표현 될 수 있고 질문의 문자를 충족시킵니다. 그러나 우리는 그것이 거의 미스에 가까운 바다에서 작은 정확도의 섬이라는 것을 알고 있으며, 대부분의 사람들은 "정밀도가 배수구를 넘어서는 가장 큰 수"를 의미하도록 질문을 올바르게 보간했습니다. 아, CompSci가 정확한 과학이라는 것이 놀랍지 않습니까? :)
Carl Smotricz

2
@ Dananoulding 1.7976931348623157 × 10 ^ 308은 정확한 정수이지만이 특정 정수를 정확히 두 배로 저장할 수는 없습니다.
Pascal Cuoq

2

DECIMAL_DIG에서가 <float.h>그 적어도 합리적인 근사치를 제공해야합니다. 십진수를 다루고 실제로 이진으로 저장되므로 정밀도를 잃지 않고 조금 더 큰 것을 저장할 수는 있지만 정확히 말하기가 얼마나 어렵습니다. FLT_RADIX와 에서 알아낼 수 있어야한다고 생각 DBL_MANT_DIG하지만 결과를 완전히 신뢰할 수는 없습니다.


이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요.
MichaelChirico

@MichaelChirico : 답변을 작성할 때 존재했던 질문에 대한 답변입니다. 질문의 편집 내역을 보려면 질문 하단의 "편집 된 Jun 19 '14 at 11:40"링크를 클릭하십시오.
Jerry Coffin

귀하의 답변은 답변과 같은 자신감 / 권한이 결여되어 있기 때문에 의견처럼 읽습니다 ( "적어도 합리적이어야합니다 ..." "정확하게 얼마 ... 말하기 어렵다" "" "). 질문이나 답변에 대한 전문 지식이 없으므로 잘못되었을 수 있습니다. 리뷰 대기열에서 여기에 보냈을 때 내 2 센트를 넣는 것입니다 (다른 사용자가 귀하의 답변에 플래그를 지정한 것을 의미합니다).
MichaelChirico

1
@MichaelChirico : 그들은 당신이 그 주제를 잘 모르는 유일한 사람과는 거리가 멀다. 당신을 특이하게 만드는 것은 당신이 그것을 모르고 있다는 것입니다. C에서 부동 소수점 숫자의 정밀도에 대해 권위있는 것으로 보이는 대부분의 대답은 단순히 오해입니다. 예를 들어, 위의 많은 (대부분)은 doublea가 특정 IEEE 유형에 직접 대응하지만 필수는 아니며,이 답변이 작성되었을 때 특정 IEEE 유형도 언급하지 않았다는 잘못된 가정을 기반으로 합니다.
Jerry Coffin

알았다. 아마도 그 정보를 답변에 추가하는 것이 좋습니다.
MichaelChirico
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.