1. 程式人生 > >浮點數比較大小的問題

浮點數比較大小的問題

浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。

 

單精度數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)。

例如:

 

 
  1. #include<cstdio>

  2. #include<cmath>

  3. const double esp = 1e-6;

  4. int main()

  5. {

  6. double a,b;

  7. scanf("%lf %lf",&a,&b);

  8. if(fabs(a - b) <= esp)

  9. printf("ok\n");

  10. else

  11. printf("no\n");

  12. return 0;

  13. }

 

如有錯誤,還請指正,O(∩_∩)O謝謝