平时编码相对关注整形溢出情况,对于浮点数考虑溢出情况关注较少,因为计算性能的缘故本身使用浮点数的时机就很少,而且也很少会用到较大的数。
但是如果使用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
网友评论