2013-07-03 94 views
1

我聽說0.9和1之間的數字要比0和0.1之間多一些,當它們表示爲離散的有限位時(爲了說明起見,我們假設爲32位浮點數)。有人可以向我解釋爲什麼會出現這種情況,並給出一個介於0和.1之間的數字的例子,該數字不能表示,但其相應的數字介於.9和1之間(通過數學加法.9找到)可以由浮動?二進制數字的離散分佈?

(這是相關的隨機數發生器,因爲他們可以朝着不同的範圍有偏差。)

回答

5

的根本原因你的推理是錯誤的,添加0.9不是一個可翻轉操作。但是你有它倒退。在0.0和0.1之間的浮點數比在0.9和1.0之間多。至於如何製作一個無偏浮點RNG,您應該首先生成範圍[1.0,2.0)中的數字,然後相應地轉換和縮放結果。這是有效的,因爲間隔[1.0,2.0)在整個範圍內具有統一的精度(對於該範圍內的所有數字,指數是相同的)。

如果你使用IEEE單精度,它的形式工作:

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm 

剛剛修復符號和指數位,並使用統一的隨機PRNG爲整數,以填補尾數位。這同樣適用於雙倍。

2

一旦您明白浮點數使用固定數量的二進制數字作爲尾數,那麼在0.0 0.1範圍內的浮點數比在0.9 1.0之間(不是相反)的原因很容易理解其餘爲規模。想象一下,爲了說明起見,我們存儲十進制數字而不是二進制數字(原理相同),並假設我們只有尾數的兩位數字。然後,比如說,使用mantisa「57」,我們可以在區間[0 0.1)中表示很多數字:0.057 0.0057 0.00057 ...(與比例數字允許的數量一樣多)等等。但對於區間[0.9 1),我們是非常受限的:實際上我們只有10個值(尾數「9x」,一個單一的比例)。

給予0和0.1之間的數字,不能表示,但0.9和1之間的它的相應的數字的(通過數學加0.9實測值)可以通過浮法來表示一個例子?

(實際情況是相反的)。以上面的示例(尾數的兩位十進制數字),數字0.0057可表示,而0.9057不可表示。