2014-03-01 85 views
0

所以,我正在寫一個相對簡單的腳本來採取積分的梯形近似。我已經很容易地返回結果,但給出了錯誤的答案。雖然我的許多預處理器定義在任何地方都開始將零錯誤排除,但需要排除故障。定義替換爲0

#include <iostream> 
    #include <cstdlib> 
    #include <sstream> 
    #include <cmath> 

    #define PI 3.141592 
    #define SLICES 25 
    #define FORMULA sqrt(1+sinh(x)*sinh(x)) 
    #define DELTA_X (UPPERBOUND-LOWERBOUND)/SLICES 
    #define LOWERBOUND 0 
    #define UPPERBOUND 3 

    using namespace std; 

    int i=0; 
    double x; 
    double y[SLICES]; 
    double length=0; 

    int main() { 


    x=LOWERBOUND; 

    cout << DELTA_X << endl; 

    while(i<SLICES+1) { //Preparing y values to calculate in next FOR loop 




    y[i] = FORMULA; 


    i++; 
    x+=(DELTA_X); 
    cout << "x" << i << " is " << x << endl; 
    } 

    for(i=0;i<SLICES;i++) { 

     double s = (DELTA_X)*(y[i]+y[i+1])/2; 


     length+=s; 

     cout << "Length" << i+1 << " is " << s << endl; 
     } 



     cout << "The approximate integral sliced " << SLICES << " times is: " << length << endl; 


     return 0; 
     } 

輸出基本上顯示打印時的所有x值,長度值和DELTA_X爲0。當我突然開始打印0時,我改變了公式和其他一些小東西,所以我試圖改回它,但沒有運氣。我最初認爲這是因爲我試圖「嵌套」定義語句(即使它正在工作),所以我試圖用標準整數替換它們。同樣的結果。任何線索我在做什麼。

+1

嘗試用常量和函數替換您的宏。 – Anthony

+0

我的猜測是編譯器將你的宏中的值解釋爲整數。嘗試替換0到0.0,3到3.0和25到25.0 –

回答

4

而其他的答案告訴你如何解決您的宏,通常是更方便的方法是拋出宏程,由常量值和inline函數替換它們:

static const double PI   = 3.141592; 
static const unsigned SLICES  = 25; 
static const double LOWERBOUND = 0; 
static const double UPPERBOUND = 3; 
static const double DELTA_X = (UPPERBOUND-LOWERBOUND)/SLICES; 

這仍然對一切都是一樣的,對吧?但是,UPPERBOUNDLOWERBOUND現在是雙打,並且(3-0)/ 25不會再導致0,這就是您的0錯誤的原因。對於FORMULA,使用內聯函數:

inline double FORMULA(double x){ 
    return sqrt(1+sinh(x)*sinh(x)) 
} 

請注意,您將需要修復您的FORMULA OCCURENCES在這種情況下,例如

y[i] = FORMULA(x); 
+0

我沒有考慮它。謝謝你的提示!我可能會,因爲如果你不小心,預處理器似乎對怪異行爲有很高的傾向。腳本正在運行,所以這個修改是接下來的! – Araymer

1
#define SLICES 25 
#define DELTA_X (UPPERBOUND-LOWERBOUND)/SLICES 
#define LOWERBOUND 0 
#define UPPERBOUND 3 

注意DELTA_X被替換爲(3-0)/25,它等於0,因爲它是整數除法。

你應該重新定義DELTA_X作爲

#define DELTA_X ((double)((UPPERBOUND)-(LOWERBOUND))/(SLICES)) 
1

使用DELTA_X必須上浮

#define LOWERBOUND 0.0f 
#define UPPERBOUND 3.0f 

變量,否則DELTA_X始終爲0

+1

這些宏最終用於間接的問題中的x變量是雙重的,那麼爲什麼在你的答案中使用float而不是那個? – hvd

+0

內存節約目的...常量0.0和3.0(沒有任何標誌)顯然是正確的(浮點文字的默認類型是雙精度型)。 –