2017-09-19 60 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.h提供log()功能,就是這樣被執行的一個(因此您可以看到正確的結果)。

錯誤的結果來自您的函數,它具有未初始化的值。

的功能更改爲:

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中未初始化的返回值。

你的冪函數將計算不val^x的名字所顯示的,但val^(2^(max(0,x)))作爲線路

val *= val; 

總是計算近期val值的平方,從而執行輸入變量的x squarings。

相關問題