C 筆記(5) 浮點數的比較

2022-02-02 23:03:01 字數 1784 閱讀 3063

因為乙個浮點數的儲存並不總是精確的,例如在經過大量計算之後可能會將3.14儲存為3.1400000000001或者3.1439999999999,這時候如果直接用==來比較這兩個數的話會輸出錯誤的結果,false(c++中==只有在兩個數字完全相同的情況下才判定為true)。所以需要引入極小數eps來修正,只要不超出這個誤差,那麼就判定為true

通常定義乙個eps為常量1e-8:

const double eps = 1e-8;
對應的定義判定是否相等的操作equ

#define equ(a, b) ((fabs((a)-(b))
上面這行**是通過巨集定義來定義出乙個名為equ的函式,這個函式會將a和b相減,如果相差的結果的絕對值小於極小值eps,那麼就判定為true,否則為false。上面加這麼多括號是為了防止巨集定義可能帶來的錯誤,不能夠省略掉。相對應的,如果需要使用不等於,那麼只需要用!equ(a, b)即可。

使用上述函式的例子:

#define lessequ(a,b) (((a)-(b))
\(\cos = -1\), \(\pi = \arccos\),所以:

const double pi = acos(-1.0);
另外還有:

在經過大量計算後可能因為誤差的累計,乙個變數中儲存的0實際上是乙個非常小的負數,如果這時候對這個變數進行開根號操作sqrt,那麼會報錯(asin(x)類似,當存放的x為+1或-1時也會出現類似的情況)。因此需要用eps來保證變數在定義域內;

一些編譯環境下0.00的變數可能在輸出時會變成-0.00。這是乙個bug,只能將結果放在字串中然後和-0.00比較,如果對比成功那麼將結果加上eps來變回0.00 。

《演算法筆記》胡凡著

C 的浮點數比較

今天寫a1,比較飛彈是否到目標 y軸相等即可 到目標就畫個圈圈,也就是炸彈,結果怎麼都炸不出 搞了半天,想想事情沒那麼簡單 然後就大致比較了一下,這個世界座標軸和滑鼠座標軸位置還沒搞清楚,不過終於可以炸了 bool hasreacheddestination if pos0.y 0.5 return...

浮點數比較

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

浮點數比較

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