浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。
單精度數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(a<b&&fabs(a-b)>1e-6)。
---------------------
原文:https://blog.csdn.net/liujian20150808/article/details/50630546