浮點數比較大小的問題- IT閱讀
文章推薦指數: 80 %
浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。
單精度數7位有效數字。
(float) 雙精度數16位有效數字。
(double). 單精度數的尾數 ...
浮點數比較大小的問題
首頁
最新
HTML
CSS
JavaScript
jQuery
Python3
Python2
Java
C
C++
Go
SQL
首頁
最新
Search
浮點數比較大小的問題
2018-12-01254
浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。
單精度數7位有效數字。
(float)雙精度數16位有效數字。
(double)
單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2^(23+1)=16777216。
因為10^7<16777216<10^8,所以說單精度浮點數的有效位數是7位。
雙精度的尾數用52位儲存,2^(52+1)=9007199254740992,10^16<9007199254740992<10^17,所以雙精度的有效位數是16位
單精度浮點數的實際有效精度為24位二進位制,這相當於24*log102≈7.2位10進位制的精度,所以平時我們說“單精度浮點數具有7位精度”。
(精度的理解:當從1.000...02變化為1.000...12時,變動範圍為2-23,考慮到因為四捨五入而得到的1倍精度提高,所以單精度浮點數可以反映2-24的數值變化,即24位二進位制精度)
單精度數7位有效數字。
雙精度數16位有效數字。
浮點數取值範圍: 負數取值範圍為-3.4028235E+38到-1.401298E-45,正數取值範圍為1.401298E-45到3.4028235E+38。
雙精度數取值範圍: 負值取值範圍-1.79769313486231570E+308到-4.94065645841246544E-324,正值取值範圍為4.94065645841246544E-324到1.79769313486231570E+308。
所以在比較的時候需要用一個很小的數值來進行比較。
(二分法的思想)當二者之差小於這個很小的數時,就認為二者是相等的了。
這個很小的數,稱為精度。
精度由計算過程中需求而定。
比如一個常用的精度為1e-6.也就是0.000001.所以對於兩個浮點數a,b,如果要比較大小,那麼常常會設定一個精度如果fabs(a-b)<=1e-6,那麼就是相等了。
fabs是求浮點數絕對值的函式。
類似的判斷大於的時候,就是if(a>b&&fabs(a-b)>1e-6)。
判斷小於的時候,就是if(a1e-6)。
例如:
#include
延伸文章資訊
- 1浮點數比較大小的問題- IT閱讀
浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。 單精度數7位有效數字。 (float) 雙精度數16位有效數字。(double). 單精度數的尾數 ...
- 2IEEE754告訴我們,為什麼不能直接比較兩個浮點數是否相等?
也就是說float精度為6或7位,double是15或16位。 提示:3.45E6表示的是3450000,6被稱為指數,3.45被稱為尾數. 浮點數是採用二 ...
- 3Back to Basic: 談浮點數的比較 - novus log - 痞客邦
不熟悉浮點數的人最容易犯的錯誤之一,就是直接用== 或!= 比較兩個浮點數。以最常見的IEEE 754 浮點數來說,下面這樣的判斷式竟然不成立: if (0.1 + ...
- 42022 各銀行紅利點數卡信用卡折抵兌換比較 - Money101
Money101.com.tw 比較2022 年全台各家銀行信用卡紅利點數折抵與兌換相關優惠,想要快速累積信用卡紅利點數,或這是要輕鬆兌換,不管是花旗、中信、富邦、渣打、華南, ...
- 5【C++菜鳥問題】C++浮點數(float、double)比較、相等判斷
用"=="來比較兩個double應該相等的類型,返回真值完全是不確定的。計算機對浮點數的進行計算的原理是隻保證必要精度內正確即可。 我們在判斷 ...