0

Matlab에 배정도 숫자를 이해하려고합니다. 1 - 3 * (4/3 - 1)이 0이 아닌 이유는 무엇입니까?설명 Matlab에서 1 - 3 * (4/3 - 1) = 2.2204e - 16

+6

부동 소수점은 10 진수를 정확하게 나타내지 않습니다. [모든 컴퓨터 과학자가 부동 소수점 연산에 대해 알아야 할 내용] (https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf)을 참조하십시오. –

+1

나의 근거가없는 추측은 복식의 기본 표현으로 인해 2.22044604925031E-16으로 계산됩니다. – lzcd

+0

또한 Matlab 도움말의 "eps"를 참조하십시오 – sridutt

답변

6

실수가 4 분의 3은 이중 정밀도 (또는 다른 이진 부동 소수점 형식)로 표현할 수 없으므로 이항 합리성이 아닙니다. 따라서, 때 당신이 얻을 값이 이 정확하게 가장 가까운 표현 가능한 배정 밀도 번호에 둥근, MATLAB에서 4/3를 계산 :

1.3333333333333332593184650249895639717578887939453125 

이 값에서 1을 빼면 정확한입니다 (그것은 잘입니다 FP의 각각의 2 배 이내에 번호를 감산 정확한인지 에러 분석)이므로 4/3 - 1 결과 알려진 원리는 다음

0.3333333333333332593184650249895639717578887939453125 

세하여이 숫자를 곱한 결과는 정확하게인지 어떻게 표현 가능 :

0.9999999999999997779553950749686919152736663818359375 

마지막으로, 1.0에서 뺀 것은 (정리하여 앞서 언급)도 정확 :

0.0000000000000002220446049250313080847263336181640625 

그래서 사실 때문에, 당신의 계산에 오류를 반올림의 단일 소스가 그 4/3은 double로 표현 될 수 없으며 계산의 최종 결과는 단순히 이월 된 초기 오류입니다.

1

과학적인 계산기에서 이것을 실행하십시오 - 로그 (2.2204e-16) - (거의) 정확히 -52를 산출합니다. 즉, Matlab은 double에 52 비트의 정밀도를 저장하고 지수 (4 + 기호)에 대해 5 비트 및 유효 숫자 기호에 대해 하나씩 저장합니다. 이는 IEEE 754 구현과 일치합니다. 유효 숫자는 53 비트 (52 + 기호)이고 지수는 5입니다. 모두 잘됐다! 언제나 그렇듯이 두 개의 부동 소수점 숫자가 정확히 일치하는지 여부가 아니라 두 개의 부동 소수점 숫자가 충분히 가깝게 있는지 테스트해야합니다. IEEE 754에

if abs(x - y) < 1e-15 
     % Some code to execute when x and y are approximately equal 
else 
     % Some other code 
end 

준수의 문이 the wikipedia article에서 온다 : 같은 matlab에의 적절한 예는 보일 것이다.

+0

와우, 모드가 내 대답을 보았습니다. 그게 처음입니다. –

+0

또한 "abs"함수를 포함하여 위의 대답을 편집했습니다. 매우 중요! –

0

문제는 4/3의 계산으로 시작됩니다. 정답은 유한 수의 10 진수도 아니고 한정된 수의 비트도 표현할 수 없습니다. 결과는 4/3+r으로 저장됩니다. 여기서 r은 4/3의 실수 값과 가장 가까운 IEEE 754 64 비트 2 진 부동 소수점과 반올림 오류 4/3 사이의 차이를 나타내는 작은 절대 값 부호있는 숫자입니다.

1을 뺀 결과는 1/3+r입니다. 3을 곱하면 1+3r이됩니다. 1에서 빼면 -3r이됩니다.

최종 결과는 4/3의 원래 표현에서 반올림 오류의 -3 배입니다.