返回long double而不是double

时间:2016-05-25 10:52:31

标签: double long-double

我正在用c ++编写一个程序,我想找到我的电脑的epsilon。 我希望结果是双精度(即2.2204460492503131 E-16),但输出是1.0842 E-019,这是长双精度的epsilon。

我的节目是这样的:

#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;
}

1 个答案:

答案 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.00.5)设为L后缀,以强制它们为long double类型

还要记住在将结果值传输到std::cout时使用适当的格式,以确保输出也具有您需要的准确度/精度。默认设置(如果不控制格式,则获得的设置)可能不同。