1 回答
TA貢獻1884條經驗 獲得超4個贊
差異的主要原因是對于任何x?< 1, .9 +?x??.1 大于 .1 +?x?? .9,并且返回值小于 1。對于它返回的最大值,前一個表達式是這樣的接近 1,將其四舍五入產生 1,但后一個表達式離 1 更遠,將其四舍五入產生下一個低于 1 的表達式。Random.nextFloatfloatfloatfloat
返回的最大值Random.nextFloat為Random.nextfloat16777215/16777216。讓M成為這個最大值,讓d?= 1 ??M?= 1/16777216。
如果我們t1用實數計算,它的最大值就是0.9 +?M??.1。= .9 + (1??d?)?.1 = 1? .1??d。類似地,t2將是 .1 +?M??.9 = .1 + (1-?d?)?.9 = 1-.9??d。
t1現在我們可以很容易地看到(如果用實數計算)的最大值與 1 相差 .1??d,但t2與 1 相差 .9??d。
最大值Random.nextFloat返回 16777215/16777216 的一個原因是它是float小于 1 的最大值float。格式的精度是這樣的,導致 1 的可表示值之間的步長是 1/16777216。這意味著該鄰域中的兩個可表示值是 16777215/16777216 和 1,d是它們之間的距離。我們上面的計算表明 的最大值與1 相差t1僅 .1??d。因此,當它四舍五入為 時float,1 是最接近的float。
相反,最大值與 1 相差t2.9??d 。這意味著它與 16777215/16777216 僅相差 .1??d。所以,當它四舍五入時float,16777215/16777216 是最接近的float。
那就是使用實數運算。下面,我將展示浮點運算。它有舍入誤差,但事實證明這些誤差很小,不會改變結果。
在 中Java,源文本.1f和.9f被轉換為float,產生 0.100000001490116119384765625 和 0.89999997615814208984375。使用 執行表達式中的算術運算double,然后將結果四舍五入float以賦值給t1或t2。
t1可以計算出最大的:
nextFloat代入yields的最大回報值0.9f + 16777215./16777216 * 0.1f;。算術計算
double得出 0.999999971687793642871611154987476766109466552734375。轉換為
float1,因為該double值介于 0.999999940395355224609375(下一個較低的float值)和 1(下一個較高的值)之間,并且它更接近后者而不是前者。
t2可以計算出最大的:
nextFloat代入yields的最大回報值0.1f + 16777215./16777216 * 0.9f;。算術計算
double得出 0.99999992400407933246242464520037174224853515625。轉換為
float收益率 0.999999940395355224609375。
添加回答
舉報
