15-17 binary64的十进制小数?

zel*_*ell 3 c++ floating-point double decimal ieee-754

我从维基百科了解到,双号最多有15-17个有效十进制数字

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

double x = std::pow(10,-16);
std::cout<<"x="<<std::setprecision(100000)<<x<<std::endl;
Run Code Online (Sandbox Code Playgroud)

(为了测试它,使用这个在线shell),我明白了

x=9.999999999999999790977867240346035618411149408467364363417573258630000054836273193359375e-17
Run Code Online (Sandbox Code Playgroud)

其中有88位有效小数,显然与上述维基语的索引相矛盾.任何人都可以澄清我是否应该误解某些事情?谢谢.

use*_*717 6

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