binary64 的 15-17 位有效小数位?

15-17 significant decimal for binary64?

我从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 的上述声明相矛盾。任何人都可以澄清我应该误解什么吗?谢谢。

没有矛盾。如您所见,x 的值在其十进制扩展的第一个 7 处不正确;在那之前我数了 16 个正确的数字。 std::setprecision 不控制 std::cout 输入的精度,它只是根据您的要求显示尽可能多的数字。也许 std::setprecision 命名不当,应该用 std::displayprecision 代替,但 std::setprecision 正在发挥作用。从语言的角度来看,将 std::setprecision 视为设置 std::cout 的精度,而不是试图控制 std::cout.

参数的精度