我想更好地理解浮點算術,並且看到了一些'每個計算機科學家應該知道什麼關於浮點算術'的鏈接。如何在浮點算術和十進制中表示0.1?
我仍然不明白像0.1
或0.5
這樣的數字是如何存儲在浮點數和小數。
有人可以解釋它是如何擺放的嗎?
我知道浮體是兩部分(即與某物的力量相關的數字)。
我想更好地理解浮點算術,並且看到了一些'每個計算機科學家應該知道什麼關於浮點算術'的鏈接。如何在浮點算術和十進制中表示0.1?
我仍然不明白像0.1
或0.5
這樣的數字是如何存儲在浮點數和小數。
有人可以解釋它是如何擺放的嗎?
我知道浮體是兩部分(即與某物的力量相關的數字)。
我一直指出人們朝着Harald Schmidt's online converter,隨着Wikipedia IEEE754-1985 article與其不錯的圖片。
對於這兩個特定值,你會得到(0.1):
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 1/n
0 01111011 10011001100110011001101
| || || || || || +- 8388608
| || || || || |+--- 2097152
| || || || || +---- 1048576
| || || || |+------- 131072
| || || || +-------- 65536
| || || |+----------- 8192
| || || +------------ 4096
| || |+--------------- 512
| || +---------------- 256
| |+------------------- 32
| +-------------------- 16
+----------------------- 2
符號爲正,這是很容易的。
指數爲64+32+16+8+2+1 = 123 - 127 bias = -4
,所以乘數爲2-4
或1/16
。
尾數是矮胖。它由1
(隱含的基數)加上(對於所有那些值爲1/(2n)
的位爲n
開始於1
並增加到右邊),{1/2, 1/16, 1/32, 1/256, 1/512, 1/4096, 1/8192, 1/65536, 1/131072, 1/1048576, 1/2097152, 1/8388608}
。
當你添加所有這些,你會得到1.60000002384185791015625
。
當你乘上倍頻,你0.100000001490116119384765625
,這就是爲什麼他們說你不能代表0.1
完全一樣的IEEE754浮點,並提供了這麼多的機會,就SO人回答"why doesn't 0.1 + 0.1 + 0.1 == 0.3?"
型問題:-)
0.5的例子大大簡化了。它表示爲:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 00000000000000000000000
這意味着它是隱式的基礎上,1
,再加上沒有其它添加劑(所有的尾數位是零)。
該符號再次爲正數。指數是64+32+16+8+4+2 = 126 - 127 bias = -1
。因此乘數爲2-1
,即1/2
或0.5
。
所以最終的值是1
乘以0.5
或0.5
。瞧!
我有時會發現用小數來考慮它更容易。
數字1。345是相當於
1 + 3/10 + 4/100 + 5/1000
或:
-1 -2 -3
1 + 3*10 + 4*10 + 5*10
類似地,對於小數0.8125
的IEEE754表示爲:
s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm
0 01111110 10100000000000000000000
隨着1隱含的基礎上,這相當於二進制:
01111110-01111111
1.101 * 2
或:
-1
(1 + 1/2 + 1/8) * 2 (no 1/4 since that bit is 0)
成爲:
(8/8 + 4/8 + 1/8) * 1/2
和然後變爲:
13/8 * 1/2 = 0.8125
參見the Wikipedia entrythe IEEE group和,第一。
基本上,有一個標誌,一個數字和一個指數。如果源代碼庫中的因素不在目標庫中,則一個基地中的數字不能有限地表示在另一個基地中。例如,1/3不能表示爲有限的十進制數,但是表示爲三元(基數3)數是微不足道的:(0.1)。
所以0.5具有有限二進制表示,(0.1)2 ,即,2 -1,但0.1具有重複表示,因爲2和10具有(5)不處於因子共同。