關於C語言除0引發的思考

2022-10-04 04:57:09 字數 1402 閱讀 5264

複製** **如下:

進行浮點數程式設計時,如果沒有注意,常常會出現輸出類似 1.#ind, 1.#inf 或者 nan,www.cppcns.com inf 之類奇怪的輸出。這通常隱含了浮點數操作的異常。

進行整數除0的時候,程式會檢查出乙個錯誤,比如對於這個**:

複製** **如下:

#include

#include

int main()

執行完以後程式就會警告:warning: division by zero [-wdiv-by-zero] 

但是對於浮點數,就沒有類似的檢查:

複製** **如下:

#include

#include

int main()

不會有警告或者報錯,但是執行完以後會出現這樣的值:-1.#ind00,不知所云。於是上網查了一下,原來是這樣!

特殊浮點數的含義

1.#inf / inf:這個值表示「無窮大 (infinity 的縮寫)」,即超出了計算機可以表示的浮點數的最大範圍(或者說超過了 double 型別的最大值)。

例如,當用 0 除乙個整數時便會得到乙個1.#inf / inf值;相應的,如果用 0 除乙個負整數也會得到 -1.#inf / -inf 值。    -1.#ind / nan:這個的情況更複雜,一般來說,它們來自於任何未定義結果(非法)的浮點數運算。"ind"是 indeterminate 的縮寫,而"nan"是 not a number 的縮寫。產生這個值的常見例子有:對負數開平方,對負數取對數,0.0/0.0,0.0*∞, ∞/∞www.cppcns.com 等。  簡而言之,如果遇到 1.#inf / inf,就檢查是否發生了運算結果溢位除零,而遇到 1.#ind / nan,就檢查是否發生了非法的運算。     

特殊浮點數的判斷

很多 c 庫都提供了一組函式用來判斷乙個浮點數是否是無窮大或 nan。int _isnan(double x) 函式用來判斷乙個浮點數是否是 nan,而 int _finite(double x) 用以判斷乙個浮點數是否是無窮大。

你可能已經注意到了,上面兩個函式都是以下劃線開頭的,因此在可移植性上可能是存在問題的,那麼如何實現乙個通用的判斷版本呢?

首先,對於 nan,可以用下面的**實現:

複製** **如下:

bool isnu程式設計客棧mber(double x)

而下面的**可以判斷乙個浮點數是否是有限的(finite, 即既不是 nan 又不是 infinite):

複製** **如下:

bool isfinitenumber(double x)

其中,dbl_max 是 中預定義的常量。   

把上程式設計客棧面兩個函式結合起來,還可以實現乙個程式設計客棧浮點數是否是 inf 的判斷。

本文標題: 關於c語言除0引發的思考

本文位址:

mysql中的0引發的安全風險

menzhi007 mysql的比較運算,黑哥解釋的很清楚,感謝下 當mysql中執行where條件時 0可以作為萬用字元,來查詢索引出資料。mysql select username from users where username 0 limit 1 username admin 1 row ...

由使用tag 0 引發的問題

如果我們用了乙個父view,上面放了多個子view,每個子view都通過從0開始的tag值來進行標誌,以便於後期在像view上直接使用viewwithtag tag值來取各個子view 而在用 父view viewwithtag 0 取到的view,發現不是子view,而是這個父view,查詢資料發...

CSS 由 flex 1 引發的思考

首先明確一點是,flex 是flex grow flex shrink flex basis的縮寫。flex grow 屬性 定義專案的放大比例,預設為0,即如果存在剩餘空間,也不放大。flex shrink 屬性 定義了專案的縮小比例,預設為1,即如果空間不足,該專案將縮小。flex basis ...