2016-05-25 61 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时要使用适当的格式,以确保输出也具有所需的准确度/精确度。默认设置(如果您不控制格式)会有所不同。