2013-05-28 74 views
2

我試圖做一個程序,找到方程的根。關於我的程序的一切工作都很好,除了公式本身:它不斷返回錯誤的值(1,無窮大,0,...)。函數沒有返回正確的值C

這是我評價功能:

double f(x) { 
    return exp(-x)-sin(M_PI*x/2.); 
} 

例如,F(0.3)應該是0.287,但它返回1.000。奇怪的是,我前一段時間在另一臺計算機上嘗試了完全相同的代碼,並且它工作得很好。

+2

什麼是函數簽名? '雙f(x)'形成了病態。 – Elazar

+1

@Elazar:截至C90,它並沒有形成病態;它是一種舊式(ANSI之前的)定義,'x'類型默認爲'int'。從C99開始,「implicit'int'」規則被刪除,並且違反約束條件,需要診斷。 –

+0

@KeithThompson謝謝。你可以從我的答案中看到,我知道default-to-int - 或者可能已經猜到了,因爲* everything *默認爲int,出於某種原因...我假設f(x){}是一個格式良好的函數,它獲得一個'int'並返回一個'int':P。我很樂意知道K&R的想法。 – Elazar

回答

7
double f(x) { 
    return exp(-x)-sin(M_PI*x/2.); 
} 

類型對於x沒有被聲明,所以它默認爲int

您通過.3,所以強制爲int,成爲0

exp(-0)-sin(M_PI*0/2.) == exp(0)-sin(0) == 1.0-0 == 1.0 

請自己找個更好的編譯器,並打開警告。

0

也許你應該施放你的變量。這通常發生在我與分裂之間。

0
double f(double x) { 
...... 
} 
+0

就是這樣。我現在感到很蠢。 :( –

+0

不要擔心,適合每個人。 –

0
#include <stdio.h> 
#include <math.h> 

double f(double x) { 
    return exp(-x)-sin(M_PI*x/2.); 
} 

int main(void){ 
    printf(".3 = %f",f(.3)); 
    getchar(); 
    return 0; 
} 

結果: 」 0.3 = 0.286828'