在c ++中打印30个double值的数字

时间:2017-06-24 18:53:16

标签: c++ floating-point precision

我的理解是numeric_limits :: max_digits10给出小数点后可用的最大位数。但如果我将setprecision()设置为大于此值的值,它仍然会给出超出此最大值的非零数字:

assert(std::numeric_limits<double>::max_digits10 == 17);
std::cout << std::setprecision(30) << double(.1) << '\n';

打印出来:

0.100000000000000005551115123126

超过17的数字是否不可靠?

1 个答案:

答案 0 :(得分:3)

将双精度的53位(前导1隐含)尾数转换为二进制不动点:

0.00011001100110011001100110011001100110011001100110011010

这等于十进制值

0.1000000000000000055511151231257827021181583404541015625

将问题的结果与30位数相匹配

0.100000000000000005551115123126

然而,第54位可能是未知的,如果您认为这是一系列可能的值,那么下面和上面的二进制定点数将是

0.000110011001100110011001100110011001100110011001100110001
0.000110011001100110011001100110011001100110011001100110101

表示十进制值:

0.099999999999999984734433411404097569175064563751220703125
0.100000000000000012490009027033011079765856266021728515625

表示16或17位精度。因此,如果您认为双精度数是精确表示而不是最接近的表示,则精度的30位数只是准确的。