我的理解是,numeric_limits::max_digits10给出了小数点后可用的最大位数。但是如果我将setprecision()设置为一个大于这个值的值,它仍然会给出超过这个最大值的非零数字:
assert(std::numeric_limits<double>::max_digits10 == 17);
std::cout << std::setprecision(30) << double(.1) << '\n';这将打印出来:
0.100000000000000005551115123126超过17的数字是否不值得信任是准确的?
发布于 2017-06-25 03:14:52
将双精度浮点数的53位(隐含前导1)尾数转换为二进制定点:
0.00011001100110011001100110011001100110011001100110011010这等于十进制值
0.1000000000000000055511151231257827021181583404541015625它将问题结果与30位数字相匹配
0.100000000000000005551115123126然而,第54位是未知的,如果您认为这是一个可能值的范围,则恰好在下面和上面的二进制定点数字将是
0.000110011001100110011001100110011001100110011001100110001
0.000110011001100110011001100110011001100110011001100110101表示十进制值:
0.099999999999999984734433411404097569175064563751220703125
0.100000000000000012490009027033011079765856266021728515625这意味着16或17位的精度。因此,只有当您认为双精度数字是精确表示而不是最接近的表示时,30位精度才是准确的。
https://stackoverflow.com/questions/44739874
复制相似问题