浮点异常
发布:siney | 发布时间: 2007 12 14今天遇到一个有趣的问题,就是浮点数什么时候是无效的,或者说is Not a Number (Nan),坦白说,写了这么久(有10年了吧)也没有留意过这个问题,开始遇到这个问题的时候,最先想到的还是google,baidu,顺便用了下我们公司的有道(www.yodao.com,做个广告),都没有找到完美的答案,相反寻求答案的帖子到随处都是,看来还是有很多人碰到过这个问题,经过一番测试,给出一个比较完备的list:
| 形如 | 结果 | Vc表示为 |
| 0/0 | NaN | -1.#IND |
| N/0 (N>0) | Infinite | 1.#INF |
| -N/0 (N>0) | -Infinite | -1.#INF |
| 0 * INF | NaN | |
| 0 * -INF | NaN | |
| 0 / INF | 0 | |
| INF * INF | Infinite | |
| INF * -INF | -Infinite | |
| INF / 0 | Infinate | |
| N * INF | INF | |
| NaN 参与计算 | NaN | |
以上结果是在vc2005中浮点数计算的测试结果,默认情况下,在vc2005中除0.0计算不会抛出异常,只是计算的结果可能是NaN或者Inf,这在实际的编程中是件让人头疼的事情,我们会不知不觉陷入浮点异常的陷阱,最终的结果不如预期,而要找到这个浮点计算的罪魁祸首可能需要很长时间的调试,因为NaN和Inf还是可以继续参与计算的。
为了避免浮点计算异常,我们可以通过_controlfp函数设置开启浮点异常检查:
_controlfp(_EM_INVALID,_MCW_EM);
这样当计算出现INF,NaN的时候,会抛出异常,这样变可以快捕捉错误,从而处理,更多信息可以参考MSDN,/fp (Specify Floating-Point Behavior)章节。
知道了浮点出会出现NaN,如果不抛出异常的情况下,我们如何判断一个浮点数时不时NaN呢?使用_isnan函数吧,这里需要注意的是INF是一个合法的浮点数,及is a number,所以_isnan函数的检查是可以通过,如果想知道一个float是不是infinite,使用_finiate函数可以检查这样的情况?
- 相关文章:
- 1.casear
- 不错,写得很详细,前几天正好也碰到了这个问题,用_isnan测试解决了问题,vc为什么不是默认打开浮点异常检查呢,是不是效率的问题。
- 2007-12-26 17:25:31 回复该留言
发表评论
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。






