1 回答

TA貢獻1884條經(jīng)驗 獲得超4個贊
差異的主要原因是對于任何x?< 1, .9 +?x??.1 大于 .1 +?x?? .9,并且返回值小于 1。對于它返回的最大值,前一個表達式是這樣的接近 1,將其四舍五入產(chǎn)生 1,但后一個表達式離 1 更遠,將其四舍五入產(chǎn)生下一個低于 1 的表達式。Random.nextFloat
float
float
float
返回的最大值Random.nextFloat
為Random.nextfloat
16777215/16777216。讓M成為這個最大值,讓d?= 1 ??M?= 1/16777216。
如果我們t1
用實數(shù)計算,它的最大值就是0.9 +?M??.1。= .9 + (1??d?)?.1 = 1? .1??d。類似地,t2
將是 .1 +?M??.9 = .1 + (1-?d?)?.9 = 1-.9??d。
t1
現(xiàn)在我們可以很容易地看到(如果用實數(shù)計算)的最大值與 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
。
那就是使用實數(shù)運算。下面,我將展示浮點運算。它有舍入誤差,但事實證明這些誤差很小,不會改變結(jié)果。
在 中Java
,源文本.1f
和.9f
被轉(zhuǎn)換為float
,產(chǎn)生 0.100000001490116119384765625 和 0.89999997615814208984375。使用 執(zhí)行表達式中的算術(shù)運算double
,然后將結(jié)果四舍五入float
以賦值給t1
或t2
。
t1
可以計算出最大的:
nextFloat
代入yields的最大回報值0.9f + 16777215./16777216 * 0.1f;
。算術(shù)計算
double
得出 0.999999971687793642871611154987476766109466552734375。轉(zhuǎn)換為
float
1,因為該double
值介于 0.999999940395355224609375(下一個較低的float
值)和 1(下一個較高的值)之間,并且它更接近后者而不是前者。
t2
可以計算出最大的:
nextFloat
代入yields的最大回報值0.1f + 16777215./16777216 * 0.9f;
。算術(shù)計算
double
得出 0.99999992400407933246242464520037174224853515625。轉(zhuǎn)換為
float
收益率 0.999999940395355224609375。
添加回答
舉報