51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3565|回复: 0
打印 上一主题 下一主题

浮点异常

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2008-1-10 17:55:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    今天遇到一个有趣的问题,就是浮点数什么时候是无效的,或者说is Not a Number (Nan),坦白说,写了这么久(有10年了吧)也没有留意过这个问题,开始遇到这个问题的时候,最先想到的还是googlebaidu,顺便用了下我们公司的有道(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,这在实际的编程中是件让人头疼的事情,我们会不知不觉陷入浮点异常的陷阱,最终的结果不如预期,而要找到这个浮点计算的罪魁祸首可能需要很长时间的调试,因为NaNInf还是可以继续参与计算的。
    为了避免浮点计算异常,我们可以通过_controlfp函数设置开启浮点异常检查:

    _controlfp(_EM_INVALID,_MCW_EM);
    这样当计算出现INFNaN的时候,会抛出异常,这样变可以快捕捉错误,从而处理,更多信息可以参考MSDN/fp (Specify Floating-Point Behavior)章节。


    知道了浮点出会出现NaN,如果不抛出异常的情况下,我们如何判断一个浮点数时不时NaN呢?使用_isnan函数吧,这里需要注意的是INF是一个合法的浮点数,及is a number,所以_isnan函数的检查是可以通过,如果想知道一个float是不是infinite,使用_finiate函数可以检查这样的情况?
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-6-15 12:52 , Processed in 0.068230 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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