2015-09-19 71 views
-1

爲什麼這段代碼在ris1和ris2上給我2個不同的結果?算術雙重表達式和c/C++

他們爲什麼不等於?

#include <iostream> 
#include <stdio.h> 
#include <malloc.h> 
#include <stdlib.h> 
#include <math.h> 
#include <string.h> 
#include <time.h> 

using namespace std; 

int main() { 
    double x1 = 0.4628471891711442; 
    double h = 0.51152525298500628; 
    double lambda = 0.99999999999999989; 
    double t = 0.10000000000000001; 
    double ris1 = 0; 
    double ris2 = 0; 

    ris1 = x1 - (h * exp(-lambda * t)); 

    double sub = h * exp(-lambda * t); 
    ris2 = x1 - sub; 

    printf("\n\nris1 = %1.4e", ris1); 
    printf("\n\nris2 = %1.4e", ris2); 

    return 0; 
} 

結果:

ris1 = 8.9257e-017 

ris2 = 1.1102e-016 

我在Eclipse中MinGW的工作。 這裏我的mingw安裝框架:http://ctrlv.in/638751

+0

這是所有的代碼?我不認爲這是事實,問題必須在其他地方。因爲這個代碼是沒有問題的。您是否嘗試過在獨立的編譯單元中測試代碼?請注意,這兩個值都不正確。答案是'5.5511e-17'。 –

+0

你能告訴我們更多關於你運行你的代碼的環境嗎?我無法重現您的問題。特別是我希望你發佈標準庫的版本,編譯器和用於編譯的所有選項(特別是優化相關的)以及運行代碼的處理器數據。 – mszymborski

+0

我正在使用mingw和eclipse – andrea

回答

1

鑑於你的配置,這很可能是一個執行MinGW的g ++ 4.8.1-4的錯誤,正如解釋here。請考慮更新(或降級)您的MinGW安裝。

+0

甚至避免MinGW和使用g ++不存在的操作系統。或者使用MSVC C++編譯器。 –

0

x1 - sub的差異接近double精度的最後幾位,因爲這兩個變量大約相同。 @peter

由於優化和exp()的正確性程度,預計會有輕微變化的答案。

的另一個因素是C允許double數學爲doublelong double取決於FLT_EVAL_METHOD進行。

以上2這些不能與不同的計算路徑同等使用。

通過迫使額外的精度與long double,答案是一致的

ris1 = 1.2357e-16 
ris2 = 1.2357e-16