打印long double变量的所有十进制数字

时间:2012-12-01 18:47:06

标签: c++ gcc double

我发现我的机器上的double类型对应于this维基百科文章,而long double对应于此文字:x86 Extended Precision Format

这就是为什么floor(52/log2(10))double的15位数字应该正确且floor(63/log2(10))或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

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

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

我使用的是OpenSUSE 12.1和g ++ 4.6.2。

1 个答案:

答案 0 :(得分:2)

0.1文字常量不是一个长的两倍,它可能是一个双倍。

您可能希望使用

初始化ld
 long double ld = (long double) 1.0 / (long double) 10.0;

因此,除法涉及两个长双精度操作数,所以希望在long double中完成(我不确定,你必须仔细检查相应的C ++标准)。

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