打印

运算溢出判断

[复制链接]
2754|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yhn1973|  楼主 | 2014-10-28 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
wangch_sh| | 2014-10-28 17:18 | 只看该作者
你用64位数做积不可以吗?

使用特权

评论回复
板凳
ayb_ice| | 2014-10-28 17:18 | 只看该作者
本帖最后由 ayb_ice 于 2014-10-28 17:20 编辑

没有什么快速判断,就是根据计算结果判断
这个完全取决于两个输入数的范围,而这两个数输入范围太大了
如果不能准确的判断输入范围,只能用浮点数了(针对51)

比如如果两个输入都在16位数内,就可以肯定不会溢出

使用特权

评论回复
地板
yhn1973|  楼主 | 2014-10-28 17:25 | 只看该作者
wangch_sh 发表于 2014-10-28 17:18
你用64位数做积不可以吗?

这个用的是C51,不支持64位数,再者用64位数速度也慢了很多。

使用特权

评论回复
5
yhn1973|  楼主 | 2014-10-28 17:49 | 只看该作者
ayb_ice 发表于 2014-10-28 17:18
没有什么快速判断,就是根据计算结果判断
这个完全取决于两个输入数的范围,而这两个数输入范围太大了
如果 ...

正常是不会溢出的,溢出是意外,给出警示就行,用浮点代价太大了,所花费的时间早就可判断出来了。现在的判断方法是两个数的有效位数之和大于31即为溢出,对每个数要做3个字节的与0比较、1个字节最多8次的移位判断,就是不知道还有没有更快的算法。

使用特权

评论回复
6
ayb_ice| | 2014-10-28 19:58 | 只看该作者
yhn1973 发表于 2014-10-28 17:49
正常是不会溢出的,溢出是意外,给出警示就行,用浮点代价太大了,所花费的时间早就可判断出来了。现在的 ...

恐怕你这个判断算法有问题吧

使用特权

评论回复
7
ayb_ice| | 2014-10-28 19:58 | 只看该作者
哪怕其中一个数为2也可能会溢出

使用特权

评论回复
8
dirtwillfly| | 2014-10-28 21:30 | 只看该作者
没有太好的办法

使用特权

评论回复
9
dirtwillfly| | 2014-10-28 21:43 | 只看该作者
或者可以按照十进制数进行快速判断乘积的位数:先把数写成科学记数法,比如24646=2.4646e4,就是x*10^y的形式,然后看两乘积的底数部分x,如果x是两位数,最后位数就是y1+y2+2,如果是一位数,就是y1+y2+1。其中y1和y2分别是两乘积的指数部分。
然后根据这个位数可以判断是不是溢出了。
有符号32位的数值范围在-2147483648到2147483647。当乘积为10位数时,要判断首位数是不是大于2,不大于2没有问题;大于2很可能就溢出了,但这样判断不是十分准确。

使用特权

评论回复
10
yhn1973|  楼主 | 2014-10-28 23:11 | 只看该作者
ayb_ice 发表于 2014-10-28 19:58
哪怕其中一个数为2也可能会溢出

2的话有效位数为2位,另一个乘数的有效位数不能大于29位,若大于则溢出,若不大于则不溢出

使用特权

评论回复
11
visani| | 2014-10-28 23:13 | 只看该作者
再移到另外一个数里面

使用特权

评论回复
12
menfiss| | 2014-10-29 08:12 | 只看该作者
定点数很好处理吧?

使用特权

评论回复
13
ayb_ice| | 2014-10-29 08:33 | 只看该作者
有一个方法应该可以

先将两个数都转换成无符号数,然后分别计算两个数的有效位数,这和小于等于31就没有溢出


比如0x0f0f0000有效位数是28

但其实这一通下来也要花不少时间运算

使用特权

评论回复
14
原野之狼| | 2014-10-29 09:10 | 只看该作者
用汇编写  查溢出标志   或许能行

使用特权

评论回复
15
laoxu| | 2014-10-29 14:46 | 只看该作者
原野之狼 发表于 2014-10-29 09:10
用汇编写  查溢出标志   或许能行

用汇编写, 肯定行!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

733

帖子

2

粉丝