浮點數比較大小的問題

2022-03-29 13:06:09 字數 1226 閱讀 7700

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

單精度數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#include

原文:

浮點數比較大小

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

浮點數比較大小

浮點數比較大小,由於精度問題,所以直接比較有時可能會出錯。單精度數7位有效數字。float 雙精度數16位有效數字。double 單精度數的尾數用23位儲存,加上預設的小數點前的1位1,2 23 1 16777216。因為 10 7 16777216 10 8,所以說單精度浮點數的有效位數是7位。雙...

PHP浮點數比較大小

php 比較運算子用於比較兩個值 數字或字串 等於 x y 如果 x 等於 y,則返回 true。全等 完全相同 x y 如果 x 等於 y,且它們型別相同,則返回 true。a 0.58 100 b 58 var dump a 輸出 float 58 var dump b 輸出 int 58 va...