首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++中打印30位双精度值

在c++中打印30位双精度值
EN

Stack Overflow用户
提问于 2017-06-25 02:53:16
回答 1查看 154关注 0票数 1

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

代码语言:javascript
复制
assert(std::numeric_limits<double>::max_digits10 == 17);
std::cout << std::setprecision(30) << double(.1) << '\n';

这将打印出来:

代码语言:javascript
复制
0.100000000000000005551115123126

超过17的数字是否不值得信任是准确的?

EN

回答 1

Stack Overflow用户

发布于 2017-06-25 03:14:52

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

代码语言:javascript
复制
0.00011001100110011001100110011001100110011001100110011010

这等于十进制值

代码语言:javascript
复制
0.1000000000000000055511151231257827021181583404541015625

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

代码语言:javascript
复制
0.100000000000000005551115123126

然而,第54位是未知的,如果您认为这是一个可能值的范围,则恰好在下面和上面的二进制定点数字将是

代码语言:javascript
复制
0.000110011001100110011001100110011001100110011001100110001
0.000110011001100110011001100110011001100110011001100110101

表示十进制值:

代码语言:javascript
复制
0.099999999999999984734433411404097569175064563751220703125
0.100000000000000012490009027033011079765856266021728515625

这意味着16或17位的精度。因此,只有当您认为双精度数字是精确表示而不是最接近的表示时,30位精度才是准确的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44739874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档