我发现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。