【发布时间】:2017-06-24 18:53:16
【问题描述】:
我的理解是 numeric_limits::max_digits10 给出了小数点后可用的最大位数。但是,如果我将precision() 设置为大于此值的值,它仍然会给我超出此最大值的非零数字:
assert(std::numeric_limits<double>::max_digits10 == 17);
std::cout << std::setprecision(30) << double(.1) << '\n';
打印出来:
0.100000000000000005551115123126
超过 17 的数字是否不可信?
【问题讨论】:
-
Double 定义为 1.7E +/- 308(15 位),因此某些数字最多可以达到 308 位。但请先阅读@ThomasMatthews 的建议。
-
double的精度不像 ±10^(-17) 那样固定,它取决于数字的值。较大的值具有较差的准确性,较小的数字 - 更好。换言之,值的±误差是相对于该值确定的。如您所见,数字 x 的误差约为 ±0.00000000000000005 * x -
一个关于浮点的信息太多的博客:exploringbinary.com/tag/floating-point
-
“非零数字”与有意义的数字不同。存储在变量中的浮点“数字”根本不是十进制数字:它们是二进制数字;并且不能保证将二进制转换为十进制的过程只会在用完有用的信息后才给你零。
标签: c++ floating-point precision