二进制64位数的15-17位小数的含义是什么?

3

我从wikipedia了解到,双精度浮点数最多有15-17位有效十进制数字

然而,对于下面这个简单的C++程序

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

(要测试它,请使用{{link1:此在线 shell}}),我得到

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17

这个数有88位有效数字,显然与维基百科之前的说法相矛盾。有人能否澄清一下,我是否误解了什么?谢谢。

大多数数字不是有效数字;它们中的大多数不能帮助区分此值与下一个最大或最小可能的“double”值。 - Oliver Charlesworth
1
@David:我投票支持重新开放(没有意识到由于我的金徽章,我有决定性的投票权...);我认为这不是标准的“为什么FP失效?”类型的问题,它询问的是setprecision的行为与标准精度声明之间的明显差异。 - Oliver Charlesworth
1
@OliverCharlesworth 我相信这是一个老问题,一如既往地涉及到可表示性。 - David Heffernan
1个回答

6

没有矛盾。正如您所看到的,x 的值在其十进制展开的第一个 7 处不正确;在那之前我数了 16 个正确的数字。std::setprecision 并不控制传递给 std::cout 的输入精度,它只是显示您请求的尽可能多的数字。也许 std::setprecision 命名不太合适,应该替换为 std::displayprecision,但 std::setprecision 已经完成了它的工作。从语言学角度来看,可以将 std::setprecision 视为设置 std::cout 的精度,而不是试图控制传递给 std::cout 的参数的精度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接