第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

浮點數(shù)的奇怪行為

浮點數(shù)的奇怪行為

qq_遁去的一_1 2023-04-26 14:20:05
我理解 random.Float() 帶回一個介于 0.0 到 0.999 之間的浮點數(shù)...但出于未知原因,幾乎相同的代碼會返回 2 個不同的答案。我想了解為什么 t1 可以隨機 1.0 而 t2 不能。我試圖檢查一個類似的問題,但找不到任何類似的東西    Random rand = new Random();    for (int i = 0; i < 1000000000; i++) {        float t1 = 0.9f + rand.nextFloat() * 0.1f;        float t2 = 0.1f + rand.nextFloat() * 0.9f;        if (t1 == 1.0f) {            System.out.println("t1 " + t1);        }        if (t2 == 1.0f) {            System.out.println("t2 " + t2);        }    }沒有錯誤消息我只是不明白為什么 t1 有時會帶回 1.0 號而 t2 卻沒有。編輯:t1 生成最大值 0.999... *0.1 即 0.0999... + 0.9 = 0.9999... t2 生成最大值 0.999... *0.9 即 0.8999... + 0.1 = 0.9999... 兩者都應該是一樣的不?
查看完整描述

1 回答

?
慕村9548890

TA貢獻1884條經(jīng)驗 獲得超4個贊

差異的主要原因是對于任何x?< 1, .9 +?x??.1 大于 .1 +?x?? .9,并且返回值小于 1。對于它返回的最大值,前一個表達式是這樣的接近 1,將其四舍五入產(chǎn)生 1,但后一個表達式離 1 更遠,將其四舍五入產(chǎn)生下一個低于 1 的表達式。Random.nextFloatfloatfloatfloat

返回的最大值Random.nextFloatRandom.nextfloat16777215/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以賦值給t1t2

t1可以計算出最大的:

  • nextFloat代入yields的最大回報值0.9f + 16777215./16777216 * 0.1f;。

  • 算術(shù)計算double得出 0.999999971687793642871611154987476766109466552734375。

  • 轉(zhuǎn)換為float1,因為該double值介于 0.999999940395355224609375(下一個較低的float值)和 1(下一個較高的值)之間,并且它更接近后者而不是前者。

t2可以計算出最大的:

  • nextFloat代入yields的最大回報值0.1f + 16777215./16777216 * 0.9f;。

  • 算術(shù)計算double得出 0.99999992400407933246242464520037174224853515625。

  • 轉(zhuǎn)換為float收益率 0.999999940395355224609375。


查看完整回答
反對 回復 2023-04-26
  • 1 回答
  • 0 關(guān)注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號