doule 型 和float 型表示的0都不是0

2021-07-09 22:56:34 字數 2304 閱讀 4649

閱讀下面程式

#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...