Visual Studio 2008이 .9- .8999999999995 = 0.00000000000000055511151231257827을 말해주는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1662600

문제

이것을 Visual Studio 2008 바로 즉시 창에 입력하면 :

? .9 - .8999999999999995

그것은 이것을 답으로 준다 :

0.00000000000000055511151231257827

이 문서에 따르면 더블에는 15-16 자리의 정밀도가 있지만 32 자리의 정밀도로 결과를 제공하고 있습니다. 여분의 정밀도는 어디에서 왔습니까?

도움이 되었습니까?

해결책

거기 ~이다 답에 15-16 자리 만. 주요한 제로는 모두 계산하지 않습니다. 숫자는 실제로 5.5511151231257827 × 10과 비슷합니다-16. Mantissa 부분에는 15-16 자리가 있습니다. 지수 (-16)는 10 진수 지점을 16 곳으로 이동시키는 역할을하지만 전체 숫자의 숫자 수는 변경되지 않습니다.

편집하다

의견을 얻은 후, 나는 실제로 무슨 일이 일어나고 있는지 궁금합니다. 문제의 숫자를 이것에 꽂았습니다 IEEE-754 변환기. 마지막 "27"을 "30"으로 반올림하는 자유가 있었지만 결과가 바뀌지 않는다고 생각합니다.

변환기는 숫자를 세 바이너리 부품으로 분류합니다.

표시 : 0 (긍정적)
지수 : -51
중요도 : 1.01000000000000000000000000000000000000000000000000 (1.25 용 바이너리10)

따라서이 숫자는 1.01입니다2 × 2-51, 1.2510 × 2-51. 3 개의 중요한 이진 숫자가 저장되어 있기 때문에 LARS가 무언가에있을 수 있음을 시사합니다. 숫자가 변환 될 때마다 동일하기 때문에 "무작위 노이즈"가 될 수 없습니다.

데이터는 저장된 숫자가 "5"임을 시사합니다. 주요 0은 지수에서 나오고 겉보기에 랜덤 숫자의 나머지 부분은 컴퓨팅 2-51.

다른 팁

당신은 읽어야합니다 : 모든 컴퓨터 과학자가 부동 소수점 산술에 대해 알아야 할 것.

기본적으로 유한 정밀도로 플로팅 포인트 번호가 저장됩니다. 일부 델타와 비교해야합니다.

if(.9 - .8999999999999995 <= 0.0001)
  //close enough to be equal

주요 0은 정밀도의 일부가 아닙니다 ( 부동 소수점 번호 걱정 - 수학적으로 말하면 ~이다 중요한). 주요 0은 플로팅 포인트 번호의 내부 표현의 지수 부분 때문입니다.

부분 55511151231257827 ( 중요합니다 또는 만티사)에는 17 자리 숫자가 있으며 15-16 자리에 충분히 가깝습니다.

@lars d : 당신이 정확하다고 생각하는 것은 정확합니다. 맥락에서 질문의. .9 - .8999999999999995 0.625의 값과 -50의 지수를 가진 플로트로 작동합니다. 0.625 * 2 복용-50 결과 5.5511151231257827E-16. 이제 원래 질문의 맥락에서 우리는 17 개의 중요한 숫자를 가진 숫자가 있습니다. 하다 0.0000000000000005의 최고의 이진 근사가 될 것입니다. 그러나, 주요 0은 부동 소수점 수의 표현에 관한 한 여전히 중요하지 않습니다.

? .9 - .8999999999999995

15-16 자리 의이 뺄셈 프로세스는

0.0000000000000005

나머지 숫자는 반올림 오류입니다. 그러나 컴퓨터는 첫 번째 0이 아닌 숫자 이후에 항상 15-16 숫자를 저장하기 때문에 반올림 오류가 표시되며 반올림 오류로 인해 많은 후행 임의 자리가 생성됩니다. 따라서 결과는 뺄셈 작업에서 16 자리 숫자와 결과 저장에서 16 자리 숫자가있어 32 자리를 제공합니다.

"플로팅 포인트"의 "플로팅"부분은 5.5511151231257827 * 10^(-16)에 가까운 무언가를 얻고 있음을 의미합니다. 물론 모든 것이 후드 아래 바이너리에서 이루어지기 때문에 정확히 표현되는 방식은 아니지만 요점은 숫자가 중요한 숫자로 표시되며 숫자는 radix를 얼마나 멀리 이동하는지 (소수점)를 나타내는 숫자입니다. 항상 그렇듯이 Wikipedia는 더 자세한 내용을 제공 할 수 있습니다.

(두 번째 링크는 특정 사례에보다 구체적으로 중점을 둡니다.)

바이너리 시스템에서 5는 2로 나눌 수 없기 때문에 주기적이기 때문에 마크 러쉬 코프가 말한 내용이 적용되기 때문이라고 생각합니다.

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