2012-01-27 4 views
2

것은 내가 옥타브에이를 입력하면 : a == b, 지수 표기. 옥타브 괴짜?

a = 8*10^-5; 
b = 8.0e-005; 
a==b 

내가 대답 얻을 :

ans = 1 

을하지만 옥타브에이를 입력하면 :

a = 3*10^-5; 
b = 3.0e-005; 
a==b 

나는이 대답을 얻을

ans = 0 

내가 누락 된 것이 있습니까? 이것이 평등을 테스트하는 올바른 방법이 아닌가?

+0

각 경우에'a-b'가주는 것은 무엇입니까? –

+0

첫 번째 경우 (a == b가 1을 반환) a-b는 0을 반환합니다. 두 번째 경우 (a == b가 0을 반환) a-b는 3.3881e-021 – moondog

답변

1

이것은 컴퓨터 시스템에서 부동 소수점 숫자가 나타나는 방식에 공통적 인 문제입니다.

십진수로 '반올림'되는 많은 숫자는 컴퓨터에서 사용하는 이진 표현에서 반복되는 분수가되며 약간의 정밀도가 손실되기 때문에 어느 시점에서 잘려야합니다. 두 개의 부동 소수점 숫자가 다르게 도착하면,이를 약간의 슬롭 (예 : abs(a-b) < EPSILON 여기서 EPSILON은 1e-12와 같은 적절한 상수입니다.

3

예를 들어 Java에서 3 * Math.pow(10, -5)과 같이 부동 소수점 숫자와 관련된 계산 중에 정밀도가 손실 된 결과로 두 번째 예제에서 더 이상 b가 아닌 '2.9999999999999997E-5'가됩니다. 이것은 표현식 평가 중에 부동 소수점 값이 표현되고 전개되는 방식과 관련이 있습니다. 보다 정교한 관점을 위해, 당신은 google '정밀도 상실'을 접미사로 사용하여 이러한 표현식을 평가하는 데 사용 된 환경/환경에 추가 할 수 있습니다. 희망이 도움이됩니다.

+0

을 반환합니다. 나는 지금 무슨 일이 일어 났는지 이해한다고 생각한다. 저는 동일한 표기법을 사용하여 변수 "= 3 * 10^-5"을 만드는 데 사용 된 동등성 (a == 3 * 10^-5)을 테스트했습니다. 하지만 데이터를 저장하고 다시로드 한 후에 테스트를 실행 했으므로 저장 중에 정밀도가 변경되었을 수 있습니다. (그래도 승수가 3 일 때만 문제가 발생하는 이유는 아직 이해가되지 않습니다. 곱셈기가 다른 숫자 일 때 작동합니다.) 어떤 경우이든 지금 제 코드가 작동합니다. – moondog

+0

당신이 잘 운영되고 있다는 말을 잘 듣고 싶습니다. 재생되는 3 이외의 다른 값이 있어야합니다 (예 : 5. 실제로 결과를 저장하고 검색하면 예상치 못한 행동이 발생할 수 있습니다. 특히 대중 교통 변수 유형이 다른 경우 (예 : double 대 float. –