2016-05-25 77 views
0

我正在寫一個程序在C++中,我想找到我的電腦的epsilon。 我想要的結果是雙精度(這是2.2204460492503131E-16),但輸出是1.0842E-019,這是長雙精度的ε。返回長雙而不是雙重

我的計劃是這樣的:

#include <iostream> 

double e = 1.0; 
double x; 

int main() 
{ 

    for (int i = 0; e + 1.0!=1.0 ; i++) 
    { 
     std::cout<<e<<'\n'; 
     x = e; 
     e/=2.0; 
    } 

    std::cout << "The epsilon of this Computer is "<< x <<'\n'; 

    return 0; 
} 

回答

0

輸出std::numeric_limits<double>::epsilon()代替。 std::numeric_limits在標準報頭<limits>中聲明。

一個更常見的技術,如果你真的必須計算的話(而不是信任你的標準庫,以提供正確的值)

double epsilon = 1.0; 

while ((1.0 + 0.5 * epsilon) != 1.0) 
    epsilon *= 0.5; 

或做計算。

注意,(雖然你沒有展示你是如何做到的),它實際上可能是你的long double計算這是不正確的,因爲文字浮點值(如1.0)被默認爲double型的,而不是long double - 這可能建議在計算long double結果時出現錯誤,而不是double。如果您希望結果爲long double,則建議將所有文字值(1.0,0.5)設爲L後綴迫使他們是long double類型。

還要記住在將結果值傳送到std::cout時要使用適當的格式,以確保輸出也具有所需的準確度/精確度。默認設置(如果您不控制格式)會有所不同。