我发现我的机器上的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。
答案 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