2017-09-19 2 views
0

내 프로그램은 함수에 전달 된 값의 자연 로그를 인쇄합니다. 내가 관찰 한 이상한 점은 더미 변수에 값 0.1을 할당하고 인자로 넘겨 주면 함수가 잘못된 값을 반환한다는 것입니다. 실제 값 0.1을 직접 전달하면 올바른 답을 얻을 수 있습니다.변수와 값으로 전달 된 매개 변수는 모두 다른 대답을 반환합니다.

#include <stdio.h> 

double pow(double val, int x) { 
     int i; 
     for(i = 1; i <= x; i++) { 
       val *= val; 
     } 
     return val; 
} 

double log(double val) { 
     int i; 
     int n = 20; 
     double ret_val; 
     for(i = 1; i < n; i++) { 
       ret_val += pow(-1,i+1) * pow(val-1,i); 
     } 
     return ret_val; 
} 

int main() { 
    double dummy; 
    dummy = 0.1; 
    printf("%f",log(dummy)); 
    printf("%f",log(0.1)); 
    return 0; 
} 

여기에 뭔가가 빠졌습니까? 같은 가치가 다른 답을 어떻게 반환 할 수 있습니까?

+2

'double ret_val;': 초기화되지 않은 변수를 사용했습니다. – BLUEPIXY

+0

또한 내장 함수 이름 ('log'과'pow')을 사용하지 마십시오. – BLUEPIXY

답변

2
double ret_val; 

정의되지 않은 동작를 호출, 함수 log()에 초기화되지 않은을 사용한다.

하지만 문제는 두 번째 경우 표준 헤더 math.hlog() 기능을 제공하며 그 결과가 올바르게 실행된다는 것입니다. 따라서 올바른 결과가 표시됩니다.

함수에서 잘못 나온 결과는 초기화되지 않은 값입니다.

는 귀하의 기능을 변경

:

double mylog(double val) { 
     printf("Executed\n"); 
     ... 
} 

당신은 얻을해야합니다

이제
prog.c:3:8: warning: conflicting types for built-in function 'pow' [-Wbuiltin-declaration-mismatch] 
double pow(double val, int x) { 
     ^~~ 

Executed 
2.117386 
-2.302585 

하나 math.h이 코드에 포함되지 않는다는 것을 생각해야하지만, 일부 컴파일러는 헤더를 포함하는 경향이 그들이 생각이 필요합니다. 그것은 당신의 경우에 일어난 일입니다.

이러한 불쾌한 상황을 피하기 위해 기본 제공 함수 이름을 사용하지 않는 것이 좋습니다.

+1

네가 옳았 어! 감사. 내 구현이 틀렸고 올바른 대답은 기본 제공되는 로그 기능 때문인 것 같습니다. – Ajayv

1

항상 나타나는 모든 경고를 배우고 해결하면서 -Wall으로 컴파일하십시오. 이렇게하면 초기화되지 않은 반환 값 log이 직접적으로 피할 수 있습니다.

전원 기능은 그래서 당신은 입력 변수의 x squarings 수행, 라인

val *= val; 

항상 val의 최근 값의 제곱을 계산으로하지 이름이 시사하는 것처럼 val^x하지만 val^(2^(max(0,x)))을 계산합니다.

관련 문제