2013-03-22 99 views
1

我試圖更好地瞭解實數行浮點值的分佈情況。均勻分佈的浮點值的最大範圍?

我寫這個代碼計數均勻分佈表示的值的範圍(-R,R)其中R是的的功率(也與2的冪試過)號:

public class Foo { 
    public static void main(String[] args) 
    { 
     for(int i=0; i<24; i++) 
     { 
      int count = 0; 
      float R = (float) Math.pow(10, i); //(2<<i); 
      float Rstep = Math.ulp(R); 
      for(float x = -R; x <= R; x+=Rstep) 
       count++; 
      System.out.println(R+" "+count+" "+Math.ulp(R)); 
     } 
    } 
} 

我在結果感到驚訝由方差即

1.0 16777217 1.1920929E-7 
10.0 20971521 9.536743E-7 
100.0 26214401 7.6293945E-6 
1000.0 32768001 6.1035156E-5 
10000.0 20480001 9.765625E-4 
100000.0 25600001 0.0078125 
1000000.0 32000001 0.0625 

如我最好半相信自己均勻分佈的值的數量將是16777216(即1對於23位尾數,由於符號位而加倍)。

爲了說明這個問題 - 我試圖建立一個模型(它使用精確到幾個數量級的SI單位,例如以km到納米的距離),但必須將其映射到浮動空間(用於加載到一個GPU)。由於這是一個科學模型,我需要了解精度在哪裏丟失。計劃是將值捕捉到均勻分佈的範圍 - 所以從上面的表格捕捉到範圍(-1000,1000)會給我32768001個精確值。

對我來說,在這些範圍內會有如此多的變化以及爲什麼2個案件的權力是有限的。

有人能解釋如何思考這個問題嗎?

歡呼聲

+0

我想你忘了零。 – alestanis 2013-03-22 21:46:36

+0

謝謝 - 我並不是很擔心這種潛在的錯誤(儘管它會很好理解) - 更多的因素爲2的方差 – user2152466 2013-03-22 21:49:27

+0

「均勻分佈」是什麼意思?包含零值的唯一間隔,其中'浮動'值具有一致的間距,從-2 ** - 125(約-2.35e-38)到+2 ** - 125及其所有子區間。在此間隔中,間距爲2 ** - 149(約1.40e-45)。除此之外,步長不一;可表示值的分佈不均勻。 – 2013-03-23 12:23:38

回答

2

你應該真的打印在十六進制浮點數,它會更清晰。

「您估計的」16777216(即對於23位尾數的1 < < 23,由於符號位而翻倍)「僅爲您預期的一半。最好的情況是從一個十六進制數字看起來像-0x1.FFF ... pX的數字開始,也就是說,剛好在2的冪下面的數字就是相反的數字。當重複添加初始ULP時,您確實會遍歷指數爲X的有效數的所有值。這就是您推斷的23個步驟。當你完成後,你將一半接近零,因爲你開始。相同數量的步驟將使您歸零(指數低於X),然後再將正數值的步數加倍。因此,這就是可以在任何接近2的冪和它的相反方向之間找到的均勻隔開的花車。您可以獲得大約1000步的數量,因爲1000只是在兩個1024的冪下。

正如您注意到的,最糟糕的情況是從數字剛好在2的冪以上開始,例如0x1.00001pX。然後,你遍歷幾乎沒有指數X的值,而是立即開始訪問指數較低的值。你最終會訪問只有一半多的值,如果你已經從0x1.FFF開始,你將有...的pX


注:符號-0x1.123defpX應該被解釋爲-0x1.123def * 2^X.也許你的編程語言接受它來輸入和/或輸出浮點值。重新迭代時,試圖理解正在發生的事情非常方便。