2010-09-24 43 views
1

我在一個簡單的程序中有一個非常奇怪的問題,一直無法達成任何合理的結論。當我將程序的輸出重定向到一個文件時,我得到的結果與打印到stdout時不同。當我打印到文件時,結果是正確的。我不明白爲什麼它首先會有所不同。這是一個片段。有任何想法嗎?輸出錯誤在c + +

for (int i = 1; i <= N; i++) { 
    double x = i*h; 
    for (int j = 1; j <= N; j++) { 
     double y = j*h; 
     double bi = h*h*f(x,y); 
     if (x+h == 1.0) { 
      bi += boundary_f(1,y); 
     } 
    if (y+h == 1.0) { 
     bi += boundary_f(x,1); 
    } 
    cout << "i=" << i << "; j=" << j << "; b=" << bi << "\n"; 
    b(k,1) = bi; 
    ++k; 
} 

當打印到標準輸出和重定向到文件時,我得到不同的結果!似乎y + h == 1.0的條件不會計算爲true,即使當y + h爲1.0時,輸出到stdout但是被重定向到文件時,它的計算結果是正確的。

+0

程序是否寫入cerr?如果是這樣,你看到的問題是與cout和cerr輸出混合? – Doug 2010-09-24 11:27:11

+0

不僅cout。當重定向到cout vs file時,似乎條件(y + h == 1.0)的計算方式不同。 – user236215 2010-09-24 11:30:58

+1

@ user236215:您能否顯示您是如何從命令行運行程序的,以及某些(如果不是全部)輸出?如果沒有這個或完整的代碼,就不可能重新創建問題或推測它發生的原因。 – 2010-09-24 11:40:52

回答

2

比較絕對平等的double值是不好的。你不能保證程序是否輸入'如果'條件。相反,你可以做的是這樣的:fabs(y+h-1.0) < EPSILON其中EPSILON將是東西10^-5.

+0

我明白了。這是一個簡單的例子。我通常通過將絕對誤差與ε進行比較來進行比較。但是當我用這種邏輯代替時,在這種情況下,我仍然得到不同的輸出結果。這真的讓我瘋狂。我正在研究潛在的緩衝區溢出問題。 – user236215 2010-09-24 11:35:11

+0

你是對的。我的浮點比較函數中存在一個錯誤。我修好了,現在可以正常工作了。謝謝! – user236215 2010-09-24 11:47:51