小心浮点数溢出

平时编码相对关注整形溢出情况,对于浮点数考虑溢出情况关注较少,因为计算性能的缘故本身使用浮点数的时机就很少,而且也很少会用到较大的数。

但是如果使用pow之类的函数的时候,就要关注下是否会有溢出的情况。

例如:

double fTemp1 = pow(-1.2, -1.2);        // 会得到-nan(ind)

double fTemp2 = pow(10.0, 330.0);     // 会得到inf

 

INF:表示“无穷大inf (infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围

IND:它们来自于任何未定义结果(非法)的浮点数运算。"IND"是 indeterminate 的缩写,而"nan"是 not a number 的缩写

 

如果产生了这些结果,后续的计算的值就无法预测了,因此有条件要将计算限定在安全的范围内

如若不然,则需要增加对应的条件判断,有一些宏可以用作判断:

VS有提供一个名为float.h的文件,里面有对应浮点数的一些关键宏可以用做判断。

例如

#define DBL_MAX          1.7976931348623158e+308 // max value

#define DBL_MAX_10_EXP   308                     // max decimal exponent

#define DBL_MAX_EXP      1024                    // max binary exponent

#define DBL_MIN          2.2250738585072014e-308 // min positive value

#define DBL_MIN_10_EXP   (-307)                  // min decimal exponent

#define DBL_MIN_EXP      (-1021)                 // min binary exponent

 

另外,也可以考虑开启浮点数异常,及时知晓有问题存在,开启方式:

    unsigned int cw;

    _controlfp_s(&cw, 0, 0); 

    cw &= ~(EM_OVERFLOW | EM_UNDERFLOW | EM_ZERODIVIDE |

                     EM_DENORMAL | EM_INVALID);

    unsigned int cwOriginal;

    _controlfp_s(&cwOriginal, cw, MCW_EM); //Set it.

 

参考资料:

https://blog.csdn.net/happyflovef/article/details/6168507

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不二星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值