15-17 binary64的十进制小数?

时间:2015-01-03 19:05:47

标签: c++ floating-point double decimal ieee-754

我从wikipedia得知双号最多有15-17个有效小数

但是,对于下面的简单C ++程序

double x = std::pow(10,-16);
std::cout<<"x="<<std::setprecision(100000)<<x<<std::endl;

(为了测试它,使用this online shell),我得到了

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17

有88个有效小数,显然与上述Wiki的声明相矛盾。任何人都可以澄清我是否应该误解某些事情?谢谢。

1 个答案:

答案 0 :(得分:6)

没有矛盾。如您所见,x的值在其小数展开的第一个7处不正确;在此之前我算了16个正确的数字。 std::setprecision无法控制std::cout输入的精度,它只显示您请求的位数。可能std::setprecision命名不佳,应该由std::displayprecision替换,但std::setprecision正在执行其工作。从语言学的角度来看,将std::setprecision视为设置std::cout的精度,而不是试图控制std::cout的参数精度。