一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 455|回复: 6
收起左侧

[学C/C++] 求一个非负整数的bit pattern的时候出的问题

[复制链接] |试试Instant~ |关注本帖
ykay25 发表于 2016-5-17 17:37:22 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
本帖最后由 ykay25 于 2016-5-17 17:51 编辑

闲着无聊写的,发现出了一个很奇怪的问题,如下


                               
登录/注册后可看大图


就是把这个非负整数分解成2的次方加和,
如果有8存在,而且8是最后一项的话,比如56=32+16+8,或者24=16+8,或者8自己,等等,就会出现这样的错误。。。。。。其他都不会出错

而且输入64的话也会变成 x = 64, a = 5, x = 32, a = 5,所以一个正整数分解成2的次方加和,最后一项为64或8分解出来都有这样的问题,

4096也是。。。。。。

 楼主| ykay25 发表于 2016-5-17 17:38:43 | 显示全部楼层
因为本来想设计只放8个bit制的所以array就取了8项,不过这个不是重点。。。。
回复 支持 反对

使用道具 举报

 楼主| ykay25 发表于 2016-5-17 17:39:31 | 显示全部楼层
7那里是0000 0111 被我画的红色勾挡掉了
回复 支持 反对

使用道具 举报

 楼主| ykay25 发表于 2016-5-17 17:46:01 | 显示全部楼层
本帖最后由 ykay25 于 2016-5-17 17:50 编辑

尝试了直接
cout一个 log(8) / log(2),输出结果的确是3,
cout一个 log(64) / log(2),输出结果的确是6,

非常不理解。。。

回复 支持 反对

使用道具 举报

stellari 发表于 2016-5-18 23:52:15 | 显示全部楼层
提示一句,你把a先改成double型,你自己看一下打印出的结果是什么?
回复 支持 反对

使用道具 举报

 楼主| ykay25 发表于 2016-5-19 10:17:50 | 显示全部楼层
stellari 发表于 2016-5-18 23:52
提示一句,你把a先改成double型,你自己看一下打印出的结果是什么?

求明示原因……

改成double输出的确是a=3!但是a改成double不符合我的设计意图啊
回复 支持 反对

使用道具 举报

stellari 发表于 2016-5-19 13:17:45 | 显示全部楼层
ykay25 发表于 2016-5-19 10:17
求明示原因……

改成double输出的确是a=3!但是a改成double不符合我的设计意图啊

原因是,浮点数的计算不能保证一定精确。log(8)/log(2)的理论值确实是3,但是对于有限位数的浮点数来说,实际计算的结果可能大于或小于理论值。在这种情况下,计算出的实际值估计是2.999999999999。看起来好像和3差不多?但是一旦你把这个结果赋给一个int型,小数部分就会被全部被舍去,于是就成了2,就导致了巨大的差别。
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-4 16:08

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表