2008-10-03 5 views
1

IF 문이 무엇을하는지 정확히 이해하지 못했습니다. 변수 x0과 같은지 확인하고 있습니다. 이것이 true 인 경우 변수 y의 ABSOLUTE 값이 반환됩니다 ...이 점은 제가 그래프를 잃었을 때 리턴 문이 <= ESPILON을 포함하는 이유는 무엇입니까? 분명히 이것은 엡실론의 값보다 작거나 같음을 의미합니까? 그렇다면 어떻게 작동합니까? 그것이 의미하는 것이 아니라면 무엇을 의미합니까?혼란스러운 반환 문

(JAVA 코드)

final double EPSILON = 1E-14; 
if (x == 0) 
    return Math.abs(y) <= EPSILON; 
+0

빈센트 될 것이다. 어쨌든, FP 부정확성은 <=가 아닌 동등한 비교에서 주로 문제가됩니다. 태그가 지정되었습니다. –

+0

그 점은 아니지만? 이것은 * FP 부정확성을 피하기 위해 수행되었습니다 - 태그는 아주 적절하게 보입니다. – nickf

답변

12

부동 소수점 연산은 부정확하므로 동등성 테스트 (항상 나쁜 아이디어 임)보다는 개발자가 허용되는 허용 오차로 작은 수 (이 경우 1x10^-14)를 선택했습니다. 근접성이 0 인 경우. return 문은 비교를 반환하므로이 작업은 y의 절대 값을 취하고 충분히 가깝게 0 인 경우에만 true를 반환하고 EPSILON이 충분히 근접한 경우에만 true를 반환합니다.

+0

여기서 중요한 점은 y 값이 절대 값이 아닌 부울 값을 반환한다는 것입니다. –

5

Y의 절대치는 달리 < = EPSILON이고 잘못된 경우 true를 반환. < =은 return 문 앞에 평가됩니다. 이 코드는 다음과 같습니다.

if(x == 0) 
{ 
    boolean ret = Math.abs(y) <= EPSILON; 
    return ret; 
} 

코드는 왼쪽에서 오른쪽으로 읽는 것이 아닙니다. 이 평가 후 간단한 예에서는, x는, 평가 3 아니다 35 23

int x = 3 + 4 * 5; 

이다 + (4 * 5),하지 (3 + 4) * 5 *이 높은 우선 순위보다 있기 때문에 +. 원래 예제의 return 문은 우선 순위가 매우 낮습니다. +, -, <,> =과 같은 연산자는 모두 앞에 평가됩니다.

1

변수 x가 (잘, 아마도 int) 0과 같은지 확인하는 것이 옳습니다. 그러나 이것이 참이면 y의 절대 값을 반환하지 않으며 부울을 반환하고, < = 연산자의 결과.

1

부울 값을 반환합니다.

엡실론은 1E-14 값을 유지하는 double 값입니다.

이 Y의 절대 값보다 작거나 엡실론에 동일한 경우

if (x==0) { 
    return MATH.abs(y) <= EPSILON; 
} 

그래서, 무엇을 반환 점점 것은 문 IF 실제입니다.

5

함수는 부울 값 (참/거짓)를 호출하는 것 수단

Math.abs(y) <= EPSILON 

가 먼저 평가해야 전체 표현식. 그렇게 말한다면,

x != 0 

그런 다음 무엇이 반환 될지 잘 모르겠습니다.

0

오랫동안 Java를 수행하지는 않았지만 실제로는 부울 (암시 적으로 캐스트 될 수 있음)을 반환하는 것으로 보입니다.

x가 0이면 y의 절대 값이 true 일 때를 반환한다고 가정합니다. < = 엡실론, 그렇지 않으면 false를 반환합니다.

그러나 x가 0이 아닌 경우 else는 else를 다루지 않으므로 null을 반환합니다.

0

"문제"는이 조각이 조작자 우선 순위에 크게 의존한다는 것입니다 (나쁘지는 않지만 때때로 혼란 스러울 수 있음).

Here 당신이 그들의 우선 순위가 모든 자바 연산자 목록을 찾을 수 비교 here의 같은 테이블 C/C++

+0

우선 순위는 매우 쉽습니다. 메서드 호출은 항상 우선 순위가 매우 높습니다. 그 후에 한 명의 운영자 만 남아 있습니다. return은 연산자가 아니며 if 또는 while과 같이 표현식을 허용하는 구문입니다. – Darron

0

이 추가되어 있어야이

return (Math.abs(y) <= EPSILON); 

에 해당 명확성을 위해 코드로 언급 한 바와 같이, 그것은 부울을 반환합니다.

대안은 당신이 그것을 그 관련 이유에 대해 아무 말도하지 않을 경우 부동 소수점-부정확로이 태그를 재지의 목적을 이해하지 못하고,

if (Math.abs(y) <= EPSILON) 
    return true; 
else 
    return false;