0

我正在用 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;
}
4

1 回答 1

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)默认为 type double,而不是long double- 这可能表明错误在于您的计算long double结果,而不是结果。double如果您希望结果为 type long double,建议为所有文字值 ( 1.0, 0.5) 提供L后缀,以强制它们为 type long double

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

于 2016-05-25T12:36:51.170 回答