**
參考:comparing floating point numbers
總結幾點:
0. float佔4byte,精度是6~7位;double佔8byte,精度是15~16位。
1. 因為double型別或float型別都是有精度的,其實都是取的近似值,所以有個誤差。和乙個很小的數比如0.00000001(1e-8)比較就是為了在這個誤差範圍內進行比較。
舉個例子如double b = 0.123456可能是0.1234561的四捨五入後得到的結果。最後的0.0000001就表示誤差範圍了。
無論是float還是double型別的變數,都有精度限制。所以一定要避免將浮點變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式 。
double 與 0 比較:doubel a;
if ( a>-0.000001 && a< 0.000001 )對。
而 if( a == 0 )不對!
2. c/c++的浮點資料型別有float和double兩種。它們在記憶體中是以科學計數法的結果來儲存的。
型別float大小為4位元組,即32位,記憶體中的儲存方式如下:
符號位(1 bit)
指數(8 bit)
尾數(23 bit)
型別double大小為8位元組,即64位,記憶體布局如下:
符號位(1 bit)
指數(11 bit)
尾數(52 bit)
符號位決定浮點數的正負,0正1負。
指數和尾數均從浮點數的二進位制科學計數形式中獲取。
3. 關於比較大小
一般情況下用乙個absolute epsilon value來比較(if
(fabs(result - expectedresult) < 0.00001))就夠了。但是在某些對數字精度有特殊要求的domain,比如graphic,需要用更合理的方法。具體,參見引用文獻2.
comparing for equality
comparing with epsilon – absolute error
comparing with epsilon – relative error
1235 比較大小
比較大小 time limit 1000ms memory limit 65536k total submit 145 accepted 51 description 輸入兩個十進位制整數a,b,請判斷它們的大小關係。我們重新定義兩個數的大小比較規則為 誰的二進位制表示中含1的個數多誰大,若含1的個...
shell 比較大小
一 整數比較 eq 等於,如 if a eq b ne 不等於,如 if a ne b gt 大於,如 if a gt b ge 大於等於,如 if a ge b lt 小於,如 if a lt b le 小於等於,如 if a le b 大於 需要雙括號 如 a b 大於等於 需要雙括號 如 a ...
IOS float型別比較大小
int bellowgreenlow 0,bellowgreenhigh 0,bellowyellowhigh 0,aboveyellowhigh 0 int countsum 0 兩個floatleixing 比較時,不能直接相減,當比較是否相等時,應該用兩者之差的絕對值 與精度 相比,如果小於則...