浮點數的精度問題

2021-09-13 23:40:44 字數 881 閱讀 5579

float

1bit(符號位)

8bits(指數字)

23bits(尾數字)

double

1bit(符號位)

11bits(指數字)

52bits(尾數字)

對於二進位制的小數:

1.1=1×20+1×2-1=1+1/2=1.5;

1.01=1×20+0×2-1+1×2-2=1+1/4=1.25

1.0011=1×20+0×2-1+0×2-2+1×2-3+1×2-4=1+1/8+1/16=1.1875

這樣看下去,只要有足夠的位數,二進位制的小數就可以像十進位制數一樣表示任何數。但是計算機儲存空間是有限的。為了用有限的空間近似出盡量多的小數,制定了一些標準,主要是ieee754標準。

0代表正數,1代表負數。

一共8bit 能表示的數是0-255。因為要表示小數,肯定要有負指數,則指數的範圍就是-127-128。

這裡儲存的是真正的二進位制小數。

以0.09f為例,它的儲存是這樣的:0 01111011 01110000101000111101100

符號位:0 正數

指數字: 01111011對應十進位制的123,加上符號以後就是123-127=-4

尾數字: 此處省略整數部分的1,即為:1.01110000101000111101100

然後計算方式為:

1.01110000101000111101100 * 2^-4

=0.000101110000101000111101100

= 1/16 + 1/64 + 1/128+ 1/256 + …

= 0.0900000035762786865234375

這就是0.09在記憶體裡的儲存方式。所以它是不精確的。64位雙精度浮點數類似。

浮點數精度問題

一 例子 首先我們去編譯器試試 double a 1.9 通過新增監視檢視a的值 會發現a的值是1.8999999 二 開始今天的學習 在最開始學c 的時候並沒有對浮點數進行很深入的學習,認為浮點不就是小數嘛,首先在c 的巨集裡面有 flt max 和 flt min 的定義,float是四位元組的...

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...

golang 浮點數精度問題

把所有需要精確計算的資料先轉成decimal,用decimal進行精確計算 1,兩個浮點數相加減,可能不準確 1 相減 x 74.96 y 20.48 b x y fmt.println b output 54.47999999999999 2 相加 var a 0.6 fmt.println a ...