【问题标题】:returns long double instead of double返回 long double 而不是 double
【发布时间】:2016-05-25 10:52:30
【问题描述】:

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

【问题讨论】:

    标签: double long-double


    【解决方案1】:

    改为输出std::numeric_limits&lt;double&gt;::epsilon()std::numeric_limits 在标准头文件&lt;limits&gt; 中声明。

    如果你真的必须计算它(而不是相信你的标准库来提供正确的值),一个更常用的技术是

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

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2013-08-19
      • 1970-01-01
      • 2012-12-02
      相关资源
      最近更新 更多