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
.
参数的精度
我从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
.