免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1424 | 回复: 0
打印 上一主题 下一主题

思考问题,数值计算的上溢,下溢以及精度问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-11 18:59 |只看该作者 |倒序浏览
我这两天总有一种想法,这种想法基本可以总结为这样的结论:我们所作的一切事情,就是为了发现问题,或者更清晰的说,为了
定义问题。因为问题一旦被定义,就意味着其解决方法已经非常清晰。我们不能解决问题的根本原因在于我们对问题认识的还不够
深入,我们还不知道问题是什么。
今天本来在看《你的灯亮着吗》,对里面提出的几个问题颇有感触,想到了一个问题:软件为什么会有bug?
wiki上对software bug给了一些解释
http://en.wikipedia.org/wiki/Software_bug
但是这不能满足我的需求,那么,为什么软件会有bug呢?
这个问题应该是谁的问题?
1. 程序员
2. 开发经理
3. 需求定义制定者
4. 公司领导
5. 客户
6. 没有为什么,就是有bug
这是程序员的责任吗?人的认识总是有限的,我们不能等待对这个深入研究之后再动手,而是边做边发现问题,然后解决问题。也
就是说,在做之前,我们是不知道问题的,所以,出现bug其实是发现问题的一个基本方法。而在做之前,程序员是不知道这些问题
的。
是开发经理的责任吗?开发经理虽然有经验,有技术,但是并不是所有的业务情况都了如指掌,世界在变化,他之前的经验可能无
法用在这个项目上面,或者某些变化的地方没有考虑到,直到问题显现。也就是,他也没有办法去定义那些隐含的问题。
后面的类似,没有人知道问题会以什么样的形式出现,也没有人能明确定义项目可能出现的种种问题,所以,犯错是必然的,犯错
是发现问题的一个十分重要的方法。至此,我们不能做过多的要求了。
在《你的灯亮着吗》这本书里面,颇有一些非常有警示意义的言辞
1. 问题永远不会被明确定义,也不会被解决完毕,一个问题的解决必然带来另外的问题,我们要清楚问题是什么,而不是解决所有
问题,这似乎是bug mannagement的精髓。
2. 弄清楚问题的根源。
3. 这是谁的问题,不要试图解决不是你的问题。
4. 要让问题解决这感受问题所在,比如你要让老板知道你对薪水不满。
在看software bug的过程中,正好看到了关于arithmetic sub/overflow的问题,跟前段时间的实践结合起来,正好记录一下。
http://en.wikipedia.org/wiki/Arithmetic_underflow
http://en.wikipedia.org/wiki/Arithmetic_overflow
http://www.fefe.de/intof.html,这个里面提供了加减乘除的时候,检测sub/overflow的方法。
其中的这三项原则还是有些作用的
   1. Cast the numbers to a bigger integer type, then do the addition there, and check if the result is in the
right range.
   2. Do the addition normally, then check the result (e.g. if (a+23<23) overflow).
   3. Check before adding whether the number you add can fit (requires knowledge of the maximum value for that data
type)
关键不是如何做,而是决定是否要做,这很重要。方法总是很多的,关键是问题需要解决吗?问题有没有被定义错误?我们需要处
理这种溢出吗?
abs也会有风险,比如对于abs(0xffffffff)=0xffffffff,因为abs做的是取反加一,由于溢出,则正好回归本身。就出错了。
还有就是小数相乘的时候,可以是用log来避免精度损失,比如
a*b = exp(log(a)+log(b)),但是log和pow都是耗时的操作,所以我们可以使用
frexp进行拆解,将小数拆成significant和exponent两个部分,然后使用ldexp来合并,速度大概是log和exp的三倍左右
http://groups.google.com/group/pongba/browse_thread/thread/9a34bbf3c0b33399?hl=zh-CN,这里也有讨论,可以使用更多的
方法,比如GMP库,比如专用的CPU等
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94300/showart_2118336.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP