閱讀下面程式
#includeint main()
return 0;
}
試執行,看看結果是不是和你想的一樣。
#includeint main()
else
return 0;
}
通過上述程式,可以明確得到答案,但具體為什麼如此,還需要從
c語言中
float
型別變數的編碼格式說起。
浮點數表示形如
v=x * 2^y
的有理數進行編碼,
ieee
標準754
仔細制定了浮點數及其運算的標準。
十進位制的
12.34
可以這樣表示:
1*10^1 + 2*10^0 + 3*10^-1 + 4*10^-2
。同樣地,二進位制的
101.11
可以這樣表示:
1*2^2 + 1*2^0 + 1*2^-1 +1*2^-2
。注意而今之中形如
0.111…1
正好是小於
1的數。假定只用有限長度的編碼,那麼十進位制是不能準確表示想
1/3、
5/7這樣的數的,類似的,小數的二進位制表示法只能表示那些能夠被寫成
x * 2^y
的數,其他的只能用近似數來表示。
ieee
浮點標準用
v=(-1)^s * m * 2^e
的形式來表示乙個數: (
1)符號(
sign)s
決定數是負數(
s=1)還是正數(
s=0),而對
0的符號位作為特殊情況處理。 (
2)有效數(
significant)m
是乙個二進位制小數。 (
3)指數(
exponent)e
是2的冪(可能是負數),他的作用是對浮點數的加權。
乙個浮點數的位表示按上述情形劃分為
3個域。
標準c語言中,單精度
float
浮點格式的符號位
=1,有效位
=23,指數未
=8,產生乙個
32位的表示。雙精度
double
浮點格式的符號位
=1,有效位
=52,指數字
=11,產生乙個
64位的表示。
根據指數字的值,被編碼的值可以分為三種不同的情況,即,規格化值、非規格化值、特殊數值。當指數的為不全為
0且不全為
1時,屬於規格化值;當指數字全為
0時,屬於非規格化值;當指數字全為
1時,屬於特殊數值。下面主要了解一下後兩者情況。
非規格化值有兩個目的。首先提供了一種表示數值
0的方法當小數字也全為
0時,可以根據符號位的不同表示
+0.0
和-0.0
。另外乙個功能是用來表示那些非常接近
0.0的數,使用逐漸下溢位(
gradual underflow
)的方法實現這個屬性。特殊數值當指數字全為
1,而小數字全為
0時,可以表示正無窮大和負無窮大。當小數字為非零時,結果值被稱為
nan。
因為表示方法限制了浮點數的範圍和精度,所以浮點運算只能近似地表示實數運算。系統需要使用「最接近」匹配值的值儲存浮點值,這就是捨入(
rounding
)運算的任務。
ieee
規定了四種捨入方式,預設的方式是向偶數捨入,也叫向最接近的值捨入。
浮點數的表示是不精確的,不能直接比較兩個數是否完全相等,一般都是在允許的某個範圍內認為像個浮點數相等,如有兩個浮點數a,b,允許的誤差範圍為1e-6,則abs(a-b)<=1e-6,即可認為a和b相等。還有一種方法就是擴大再取整,比如a=5.23,b=5.23,直接比較 a==b一般為false,但是a和b都擴大一百倍,然後強制轉換為int型別,再用==比較就可以了
float型變數和「零值」比較的方法:
const float epsinon = 0.000001;
if ((x >= - epsinon) && (x <=epsinon))
浮點型變數並不精確,其中epsinon是允許的誤差(即精度),所以不可將float變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。如果寫成if (x == 0.0),則是錯誤的。
因為1.0在計算機中可能存為0.999999或1.00001等,很難恰好是1.0
Float型和Double混用的結果
這個問題是出現在解析excel 中的資料,並儲存在資料庫中出現的 excel單元格中顯示的是4.44,在上面fx函式的框中顯示的是4.4413422121229 在程式中解析到的值是4.44 此時還是string型別的 正常!將string型別轉換後是 4.44000005722046異常!原因 在...
float和double型資料算術運算
計算機中儲存數字是用2進製表示的,所有在儲存double型別的資料並不能精確到0.1,所以在用double做操作的時候會因為精度問題出現一些和實際不一樣的結果,如果要求精度很高的話就用bigdecimal來計算,bigdecimal提供了加 減 乘 除的方法,直接呼叫就可以了。如 計算兩個doubl...
基本型和基本型封裝型 「 」比較
1 基本型和基本型封裝型進行 運算子的比較,基本型封裝型將會自動拆箱變為基本型後再進行比較,因此integer 0 會自動拆箱為int型別再進行比較,顯然返回true 2 兩個integer型別進行 比較,如果其值在 128至127,那麼返回true,否則返回false,這跟integer.valu...