문제

나는 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을 반환합니다.

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

여기 우선 순위가있는 모든 Java 운영자 목록을 찾을 수 있으며 여기 C/C ++에 대한 동일한 테이블을 비교하려면

이것과 같습니다

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

명확성을 위해 코드에 추가되어야합니다. 언급했듯이 부울을 반환합니다.

대안이 될 것입니다

if (Math.abs(y) <= EPSILON)
    return true;
else
    return false;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top