2012-08-12 2 views
0

다음은 C 코드입니다.C의 pow()에서 인수의 정밀도

#include<stdio.h> 
#include<math.h> 
int main() 
{ 
    double n=10.0; 
    double automatic = pow(10.0,log10(n)-log10(5.0)); 
    printf("%.9lf\n",log10(n)-log10(5.0)); 
    printf("%.9lf\n",pow(10.0,0.30102996)); 
    double manual = pow(10.0,0.30102996); 
    printf("%.9lf %lf\n",automatic, floor(automatic)); 
    printf("%.9lf %lf\n",manual,floor(manual)); 
    return 0; 
} 

출력된다 : 출력으로부터

0.301029996 
1.999999836 
2.000000000 1.000000 
1.999999836 1.000000 

I는 POW의 것을 추측 할 수는 서명 POW (더블 X 더블 Y)과 같다 때문에 (X는 Y) Y는 6 자리로 반올림 그래서 0.301029996은 0.301030이되고 자동 값은 2.000000000입니다. 그렇지 않으면 수동과 동일합니다.

내 질문 :
1. 나의 추론은 정확합니까?
2. 첫 번째 질문에 대한 대답이 참이면보다 정확한 결과를 얻기 위해 어떻게이 반올림을 건너 뛸 수 있습니까?

+0

gcc가 있으므로 필요합니다. 방법 gcc에서 그것을하는 방법. –

답변

3

pow은 6 자리로 반올림되지 않습니다. IEEE double의 경우 52 비트의 소수점 이하 자릿수 (소수점 이하 15 자리)는 배정 밀도를 사용합니다. 해당 정밀도의 마지막 숫자가 정확할 수도 정확하지 않을 수도 있지만 대개는 근접합니다.

2의 기수 10 로그의 정확한 값은 0.301029995663981195213738894724 (출처 : Wolfram Alpha)에 가깝습니다. 그것은 비합리적인 숫자이며, 따라서 정확히 모든 숫자 시스템 (10 진수 또는 2 진수)으로 표현 될 수 없습니다.

결과에 log10(n)-log10(5.0)0.30102996보다 정확한 2 진수 10 로그에 더 가까운 값을 반환했습니다. 1.999999836이 표시된 이유는 0.30102996으로 바꾼 값을 수동으로 정확하지 않게 만들었 기 때문입니다. 어느 쪽이 둥근 값이 아닌지, btw - 9를 세어 라.

귀하의 전화 pow(10.0,log10(n)-log10(5.0)) 아주 약간 덜 2 이상합니다 (floor에 의한 쇼 등), 그러나 충분히 가까이는 9 개 장소에서 2 라운드 것입니다 결과를 반환했습니다. 더블 타입을 사용하면 이것보다 나아지지 않을 것입니다.

그래서 "반올림하지 마시오."라는 의미를 모르겠습니다. 값을 덜 정확하게 만들고 싶지 않으면 수동으로 9 개로 반올림하지 말고 복사 할 때 숫자를 놓치지 마세요.

+0

나는 당신의 요점을 얻었다; 그래서 그것은 printf 때문에 자동 값이 2.000000000이라는 것을 의미합니다. 실제로 그것은 2가 아니지만 여전히 1.99999 ... –

+0

@tendua : 예, 그것은 1.9999999995에서 2 사이입니다.'2.0 - pow (10.0, log10 (n) -log10 (5.0))'을 출력하면 컴파일러가 FPU가 중간 결과에 대해 배정도보다 정밀도를 사용하는지 여부에 따라 달라집니다. –