문제

나는 C ++ 코드를 Java로 포팅하는 중이며 다음을 계속 작성한 사람이 다음을 수행 한 곳에서 계속 실행됩니다.

double c = (1.0/(a+1.0)*pow(b, a+1.0));
double d = (1./(integral(gamma, dmax)-integral(gamma, dmin)))*(integral(gamma+1, dmax)-integral(gamma+1, dmin));

대신에:

double c = pow(b, a+1.0)/(a+1.0);
double d = (integral(gamma+1, dmax)-integral(gamma+1, dmin))/(integral(gamma, dmax)-integral(gamma, dmin));

두 번째는 훨씬 더 명확 해 보이며, C ++의 운영 순서에 대해 틀린 경우 똑같은 일을해야합니다. 첫 번째를하고 두 번째가 아닌 일을해야 할 이유가 있습니까? 내가 생각할 수있는 유일한 것은 정밀한 이상한 경우 일 것입니다.

도움이 되었습니까?

해결책

예, 그들은 동일합니다. 내가 생각할 수있는 유일한 이유는 수학적 명확성입니다. 때로는 양을 정상화 할 때 종종 글을 씁니다.

answer = (1/total) * (some of it)

예를 들어, Cauchy의 Integral 정리는 종종 쓰여집니다.

f(a) = (1/(2*pi*i)) * integral(f(z)/(z-a), dz)

다른 팁

만약에 a 동일하게 남아 있습니다 b 변경 중입니다 (예 : 코드가 루프에 있고 a 예를 들어 두 반복 사이에 변경되지 않습니다. 예를 들어 const 변수), 곱셈이 나누기보다 저렴하기 때문에 원래 버전이 더 빨리 실행될 수 있습니다 (컴파일러가 계산을 이동한다고 가정합니다. 1/... 루프 밖으로).

그것이 그 이유라면 최적화에 대한 잘못된 시도처럼 보이지만 그것이 그렇지 않다는 의미는 아닙니다.

아, 그리고 정밀성과 관련하여, 원래 버전은 실제로 당신보다 약간 정확합니다. 1/.... 이 반올림 오류는 컴파일러가 버전을 자체의 원래 버전으로 변환하는 것을 방지하는 것이 반올림 오류입니다. 정확히 같은 것을 계산하지는 않습니다 (그러나 매우 가까운 것).

그렇습니다. 그들은 같은 일을해야합니다. 원래 저자는 다른 곳에서 찾은 방정식을 복제했을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top