혼란스러운 반환 진술
-
03-07-2019 - |
문제
나는 IF 문이 무엇을하고 있는지 정확히 이해하지 못하고, 내가 볼 수있는 것은 변수가 있는지 확인하고 있습니다. x
int와 같습니다 0
. 이것이 있다면 true
변수의 절대 값 y
반환되었습니다 ... 이것은 내가 줄거리를 잃었을 때입니다. 왜 반환 명세서가 계속 될까요? <= ESPILON
? 확실히 이것은 엡실론의 가치보다 적거나 동일하다는 것을 의미합니까? 그렇다면 어떻게 작동합니까? 그것이 의미가 아니라면 무엇을 의미합니까?
(Java 코드)
final double EPSILON = 1E-14;
if (x == 0)
return Math.abs(y) <= EPSILON;
해결책
플로팅 포인트 수학은 본질적으로 부정확 한 것이므로 동등성을 테스트하는 대신 (항상 나쁜 아이디어), 개발자는 근접성에 대한 허용 가능한 공차로 적은 수 (1x10^-14)를 선택했습니다. . 반환 명령문은 비교를 반환합니다. 따라서 이것이 할 일은 y의 절대 값을 취하고 Epsilon에 의해 충분히 가까운 곳에 충분히 가까이있는 경우에만 true를 반환하는 것입니다.
다른 팁
y의 절대 값이 <= epsilon이고 그렇지 않으면 false 인 경우 true가 반환됩니다. <=는 리턴 명령문 전에 평가됩니다. 이 코드는 다음과 같습니다.
if(x == 0)
{
boolean ret = Math.abs(y) <= EPSILON;
return ret;
}
코드는 단순히 왼쪽에서 오른쪽으로 읽지 않습니다. 더 간단한 예는입니다
int x = 3 + 4 * 5;
이것을 평가 한 후, X는 35가 아닌 23입니다. 평가는 3 +(4*5), (3 +4)*5가 아닙니다.*는 +보다 우선 순위가 높기 때문입니다. 원래 예제의 리턴 명령문은 우선 순위가 매우 낮습니다. +, -, <,>와 같은 모든 연산자는 이전에 평가됩니다.
전체 표현
Math.abs(y) <= EPSILON
먼저 평가해야합니다. 즉, 함수가 부울 값 (true/false)을 반환한다는 것을 의미합니다. 만약 그렇게 말한다
x != 0
그런 다음 무엇이 반환 될지 잘 모르겠습니다.
변수 x가 (음, 아마도 int) 0인지 확인하는 것이 옳습니다. 그러나 이것이 사실이라면 y의 절대 값을 반환하지 않으면 부울을 반환합니다. <= 연산자.
부울 가치를 반환하고 있습니다.
Epsilon은 값 1E-14를 보유한 두 배입니다.
이것은 실제 IF 문입니다
if (x==0) {
return MATH.abs(y) <= EPSILON;
}
따라서 반환되는 것은 y의 절대 값이 Epsilon보다 작거나 같은 경우입니다.
나는 오랫동안 Java를하지 않았지만 이것이 실제로 부울을 반환하는 것으로 보입니다 (암시 적으로 캐스트 될 수 있음).
x가 0과 같으면 y <= epsilon의 절대 값이 그렇지 않으면 true를 반환한다고 말합니다. 그렇지 않으면 false를 반환합니다.
그러나 X가 0과 같지 않으면 다른 명령문이 다른 명령문을 포함하지 않으므로 NULL을 반환합니다.
이것과 같습니다
return (Math.abs(y) <= EPSILON);
명확성을 위해 코드에 추가되어야합니다. 언급했듯이 부울을 반환합니다.
대안이 될 것입니다
if (Math.abs(y) <= EPSILON)
return true;
else
return false;