2015-02-24 74 views
1

錯誤的答案我已經寫了一些代碼來整合功能5X^4 + 4X^3 + 3X^2 + 2X + 1集成使用梯形規則用C給予某些價值

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

float func(float x){ 
    float a; 
    a = 5*pow(x,4) + 4*pow(x,3) + 3*pow(x,2) + 2*x +1; 
    return a; 
} 

int main(){ 
    float numberOfXValues; 
    float a = 0;   //lower limit 
    float b = 1;   //upper limit 
    float numberOfStrips; 
    float stripSize; 
    float finalAnswer; 
    float sumFirstAndLast; //summation of first and last x value 

    while(1){ 
     printf("Input number of X values:"); 
     scanf("%f", &numberOfXValues); 

     numberOfStrips = numberOfXValues - 1; 
     stripSize = (b - a)/(numberOfStrips);      
     sumFirstAndLast = 0.5*func(a) + 0.5*func(b); 

     for (float z = stripSize; z < b; z += stripSize){ 
      sumFirstAndLast += func(z); 
     } 

     finalAnswer = sumFirstAndLast * stripSize; 

     printf("%f\n", finalAnswer); 
    } 
return 0; 
} 

而且它適用於大多數值,但13和20的輸出結果是錯誤的答案。我已經瀏覽過幾次,但無法看到可能導致此問題的原因。

Input number of X values:10 5.039070 Input number of X values:11 5.031651 Input number of X values:12 5.026160 Input number of X values:13 6.271982 Input number of X values:14 5.018732 Input number of X values:15 5.016153 Input number of X values:16 5.014071 Input number of X values:17 5. Input number of X values:18 5.010955 Input number of X values:19 5.009773 Input number of X values:20 5.798243 Input number of X values:21 5.007917

+0

預期值是多少? – Jon 2015-02-24 18:32:03

+0

什麼是正確的價值觀,爲什麼你認爲他們是正確的? – 2015-02-24 18:32:12

+0

它應該只傾向於5.除了我發佈的兩個數字之外,還有許多數字不適用於,例如。 24,28,29和32. – JaAnTr 2015-02-24 18:34:10

回答

2

的問題是,在內部循環的退出條件,你比較兩個浮點數。在numberOfStrips迭代之後,由於浮點精度,不能保證z == b。這完全有可能是z < bz > b。在z < b的情況下,它再次執行的循環。

你應該numberOfStrips整數,改寫這樣的循環:

float z = stripSize; 
for (int i = 1; i < numberOfStrips; i++) { 
    sumFirstAndLast += func(z); 
    z += stripSize; 
} 
0

乍一看,這看起來精度和float四捨五入問題。 因此將float更改爲double

例如我的機器上我得到6.27198210輸入使用float時,而我使用double時得到5.021983作爲結果。

此外,你應該在浮點比較中使用一個epsilon。

0

放置行:

printf("%f, %d\n", z, z < b); 

裏面的for環路將打印z值每次迭代與所述循環條件結果一起。最後一個輸出如下:

1.000000, 1 

這是指出我們已經達到了正確的限制,但仍然執行循環體。字面上它認爲1.000 < 1.000。使用浮點數時可能會發生這種情況,因此爲了防止出現這種情況,請考慮循環使用某個整數(例如,numberOfXValues)。