1

我发现double我机器上的类型对应于这篇维基百科文章,long double对应于这个文本:x86 Extended Precision Format

这就是为什么floor(52/log2(10))or 15 位double应该是正确的并且floor(63/log2(10))or 19 位long double是可信的。

编码:

int main()
{
    double d=0.1;
    long double ld=0.1;

    std::cout.precision(19);
    std::cout.setf(std::ios_base::scientific);

    std::cout << d << std::endl;
    std::cout << ld << std::endl;

    return 0;
}

给出输出:

1.0000000000000000555e-01
1.0000000000000000555e-01

如果我们设置cout.precision为 16,输出将是:

1.0000000000000001e-01
1.0000000000000001e-01

没关系,第一个输出的第17位和第二个输出double的第16位double不正确。但是为什么它不正确long double呢?有没有办法获得所有 19 个正确数字的long double变量?

如果我尝试printf("%.19Le\n",ld);long double,我会得到完全相同的结果。

我使用 OpenSUSE 12.1 和 g++ 4.6.2。

4

1 回答 1

2

0.1字面常量不是 long double ,它可能是 double 。

您可能需要ld初始化

 long double ld = (long double) 1.0 / (long double) 10.0;

所以除法涉及两个长双操作数,所以希望在长双操作数中完成(我不确定,你必须仔细检查适当的 C++ 标准)。

您可能希望使用支持最新标准的 GCC 进行编译。我建议使用 GCC 4.7 进行编译,g++ -Wall -std=c++11但使用 4.6 你可能需要说-std=c++0x

于 2012-12-01T18:51:39.713 回答