- UID
- 19393
- 阅读权限
- 80
- 注册时间
- 2008-4-12
- 最后登录
- 2013-5-4
- 在线时间
- 210 小时
- 性别
- 男
- 生日
- 1993 年 9 月 3 日
国王
- 耕战
- 1184
- 鹰币
- 144
- 天龙币
- 0
- 回帖
- 288
   
|

楼主 |
发表于 2010-10-12 01:25:31
|
显示全部楼层
我也嘗試來說一說吧....
大家知道電腦是如何分辨小數嗎? 大家認識的二進制好像沒有小數啊,
要電腦能夠分辨小數, 就要由人類定義一個方法給電腦分辨,
這個就是浮點數 (floating-point numbers)。
到底浮點數是如何運作的呢?
它是根據一條公式
儲存值 = M*b^e
M 代表尾數(mantissa), b 代表基數(base), e 代表指數(exponent)
浮點數共有 32-bits 來儲存數值, 一般情況下(取決於CPU),
1 bits 用作 sign bit representation, 即分辨正或負值, 0 表示正值, 1 代表負值
7 bits 用作儲存指數 (由 -64 至 +63)
24 bits 儲存尾數
我以 +20.1 這個十進制值來作例子:
+20.1(10) = +10100.1(2)
+10100.1(2) = 0.101001 * 2^5
0 1000101 1010 0100 0000 0000 0000 0000
現在來看看 +16777216 這個數值
+16777216(10) = +1000000000000000000000000(2)
+1000000000000000000000000(2) = 0.1 * 2^25
0 1011001 1000 0000 0000 0000 0000 0000 0(2)
灰色的 0 超出了 24-bits, 所以儲存不到那個灰色的 0, 最後就會變成:
01011001100000000000000000000000
現在來看看 +16777217 這個數值
+16777217(10) = +1000000000000000000000001(2)
+1000000000000000000000001(2) = 0.1000000000000000000000001 * 2^25
0 1011001 1000 0000 0000 0000 0000 0000 1(2)
灰色的 1 超出了 24-bits, 所以儲存不到那個灰色的 1, 最後就會變成:
01011001100000000000000000000000
這個值跟+16777216的一樣, 這就是為什麼 16777216 = 16777217
這也是為什麼 float 會被人說不精確。
[ 本帖最后由 nomygf 于 2010-12-26 23:31 编辑 ] |
|