2015-01-03 95 views
3

我从wikipedia是双号最多有15-17显著十进制数字15位二进制64位小数?

然而,对于低于

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

(为了测试它,使用this online shell),我得到了简单的C++程序学

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17 

其中有88个重要的十进制数字,显然与Wiki的上述声明相矛盾。任何人都可以澄清我应该误解的东西吗?谢谢。

+0

这些数字中的大部分都*不*显着;他们中的大多数无法区分这个值与下一个最大或最小可能的“双”值。 –

+1

@大卫:我投票重新开放(没有意识到我的投票由于我的金徽章...);我认为这不是[标准的“为什么FP被破坏?” - 类型的问题](http://stackoverflow.com/questions/588004/is-floating-point-math-broken);它是在询问标准精确索赔和'setprecision'行为之间的明显差异。 –

+1

@OliverCharlesworth我相信这是一个老问题,就像往常一样,关于可表示性 –

回答

6

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

相关问题