小心浮點數溢出

平時編碼相對關注整形溢出情況,對於浮點數考慮溢出情況關注較少,因爲計算性能的緣故本身使用浮點數的時機就很少,而且也很少會用到較大的數。

但是如果使用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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章