浮點數比較

2021-07-25 11:26:38 字數 1022 閱讀 4696

(0).我們來看乙個程式

#include int main()

else

}

(1)執行結果

可以看出,我們輸入的2.3和計算出來的(4.6 / 2)相等,這個沒有問題。但是如果遇到下面這個問題:

(3)我們再來看一段程式:

#include #include #define eqs 1e-8

#define equal(a,b) ( (fabs((a) < (b))) < (eqs))

int main()

(4)執行結果

什麼!?執行結果竟然出現「not equal」和「equal!」這是怎麼回事兒?

(5)總結

a.這是因為在儲存浮點數的時候,並不是按照我們想象中那麼儲存的,比如對於數浮點數2.3,可能儲存的結果是:2.2999……99或者是2.3000……001,但就不會是2.300000

我們來看乙個小實驗:

就可以看到這裡的浮點數2.3儲存結果卻是2.299……998!=2.3

b.正是因為這麼一點小誤差,導致在最後計算的時候,出現了不能判斷是否真的具有相等的性質。

c.那麼我們該怎麼判斷兩個實際相等的數呢?請看下面的這個程式:

#define eqs 1e-8

#define equal(a,b) ( (fabs((a) 

這裡的fabs()是c語言中求解絕對值函式。我們只要設定乙個閾值,就可以解決浮點數的比較問題,一般這個閾值設定為1e-8

c.這裡的fabs()函式是求絕對值的函式。

浮點數比較

在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...

浮點數比較

部分 思路來自網路。fxxki整理發布。double變數以帶符號的 ieee 64 位 8 個位元組 雙精度浮點數形式儲存 它可以表示十進位制的15或16位有效數字.負值取值範圍為 1.79769313486231570e 308 到 4.94065645841246544e 324,正值取值範圍為...

浮點數比較

這裡的內容比較全 在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以 解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是 數字計算機,不是模擬機,數字機的離散化...