操作浮點數遇到輸出nan的解決方法

2021-07-09 05:23:27 字數 993 閱讀 1053

列印浮點數輸出 1.#ind 1.#inf nan inf 等解決

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

特殊浮點數的含義

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*∞, ∞/∞ 等。

簡而言之,如果遇到 1.#inf / inf,就檢查是否發生了運算結果溢位除零,而遇到 1.#ind / nan,就檢查是否發生了非法的運算。

特殊浮點數的判斷

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

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

bool

isnumber

(doublex)

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

bool

isfinitenumber

(doublex)

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

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

浮點數操作

float fx 49.03f int nx fx 100 printf d nx 執行上述 結果 4902。用vc6.0,2005,gcc編譯執行結果都是一樣。為什麼會這樣呢,是因為浮點數運算具有不精確性。其實編譯上面的 編譯器會有警告的。warning c4244 initializing co...

1 1輸出浮點數

描述讀入乙個雙精度浮點數,分別按輸出格式 f f 保留5位小數,e 和 g 的形式輸出這個整數,每次在單獨一行上輸出。輸入乙個雙精度浮點數。輸出輸出有四行 第一行是按 f 輸出的雙精度浮點數 第二行是按 f 保留5位小數輸出的雙精度浮點數 第三行是按 e 輸出的雙精度浮點數 第四行是按 g 輸出的雙...

PHP 浮點數操作

f 3.14159 使用sprintf對浮點數小數點後三位四捨五入 f new sprintf 3f f echo 3.14159小數點後三位四捨五入 f new.f round round f,3 echo 3.14159小數點後三位四捨五入 round函式 f round.進一法取浮點數的整數 ...