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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在.NET中強(qiáng)制浮點(diǎn)是確定性的嗎?

在.NET中強(qiáng)制浮點(diǎn)是確定性的嗎?

犯罪嫌疑人X 2019-08-19 15:13:46
在.NET中強(qiáng)制浮點(diǎn)是確定性的嗎?我一直在閱讀很多關(guān)于.NET中浮點(diǎn)確定性的內(nèi)容,即確保具有相同輸入的相同代碼將在不同的機(jī)器上提供相同的結(jié)果。由于.NET缺少Java的fpstrict和MSVC的fp:strict等選項(xiàng),因此似乎一致認(rèn)為使用純托管代碼無法繞過這個(gè)問題。C#游戲AI Wars已經(jīng)決定使用定點(diǎn)數(shù)學(xué),但這是一個(gè)麻煩的解決方案。主要問題似乎是CLR允許中間結(jié)果存在于FPU寄存器中,這些寄存器具有比類型的原始精度更高的精度,從而導(dǎo)致不可預(yù)測(cè)的更高精度結(jié)果。CLR工程師David Notario撰寫的MSDN文章解釋了以下內(nèi)容:請(qǐng)注意,對(duì)于當(dāng)前規(guī)范,它仍然是提供“可預(yù)測(cè)性”的語言選擇。在每次FP操作之后,該語言可以插入conv.r4或conv.r8指令以獲得“可預(yù)測(cè)的”行為。 顯然,這非常昂貴,不同的語言有不同的妥協(xié)。例如,C#什么都不做,如果你想縮小范圍,你必須手動(dòng)插入(浮點(diǎn))和(雙)強(qiáng)制轉(zhuǎn)換。這表明,只需為每個(gè)表達(dá)式和計(jì)算浮點(diǎn)數(shù)的子表達(dá)式插入顯式強(qiáng)制轉(zhuǎn)換,就可以實(shí)現(xiàn)浮點(diǎn)確定性。有人可能會(huì)在float周圍編寫一個(gè)包裝器類型來自動(dòng)執(zhí)行此任務(wù)。這將是一個(gè)簡單而理想的解決方案!然而,其他評(píng)論表明它并非如此簡單。Eric Lippert最近表示(強(qiáng)調(diào)我的):在某些版本的運(yùn)行時(shí)中,顯式轉(zhuǎn)換為float會(huì)產(chǎn)生與不這樣做不同的結(jié)果。當(dāng)你明確地轉(zhuǎn)換為float時(shí),C#編譯器會(huì)給運(yùn)行時(shí)提供一個(gè)提示,說“如果碰巧使用這個(gè)優(yōu)化,就把這個(gè)東西從超高精度模式中取出”。這對(duì)運(yùn)行時(shí)的“提示”是什么?C#規(guī)范是否規(guī)定顯式轉(zhuǎn)換為float會(huì)導(dǎo)致在IL中插入conv.r4?CLR規(guī)范是否規(guī)定conv.r4指令會(huì)使值縮小到其原始大???只有當(dāng)這兩者都成立時(shí),我們才能依靠顯式轉(zhuǎn)換來提供浮點(diǎn)“可預(yù)測(cè)性”,如David Notario所解釋的那樣。最后,即使我們確實(shí)能夠?qū)⑺兄虚g結(jié)果強(qiáng)制轉(zhuǎn)換為類型的原生大小,這是否足以保證跨機(jī)器的可重復(fù)性,還是有其他因素如FPU / SSE運(yùn)行時(shí)設(shè)置?
查看完整描述

2 回答

?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

8087浮點(diǎn)單元芯片設(shè)計(jì)是英特爾十億美元的錯(cuò)誤。這個(gè)想法在紙上看起來不錯(cuò),給它一個(gè)8寄存器堆棧,以80位擴(kuò)展精度存儲(chǔ)值。這樣您就可以編寫中間值不太可能丟失有效數(shù)字的計(jì)算。

然而,野獸無法優(yōu)化。將FPU堆棧中的值存儲(chǔ)回內(nèi)存非常昂貴。因此,將它們保留在FPU中是一個(gè)強(qiáng)大的優(yōu)化目標(biāo)。不可避免的是,如果計(jì)算足夠深,只有8個(gè)寄存器就需要回寫。它也被實(shí)現(xiàn)為堆棧,而不是可自由尋址的寄存器,因此需要體操也可能產(chǎn)生回寫。回寫不可避免地會(huì)將值從80位截?cái)?/em>回64位,從而失去精度。

因此,非優(yōu)化代碼不會(huì)產(chǎn)生與優(yōu)化代碼相同的結(jié)果。當(dāng)中間值最終需要寫回時(shí),計(jì)算的微小變化會(huì)對(duì)結(jié)果產(chǎn)生很大影響。/ fp:strict選項(xiàng)是一個(gè)黑客攻擊,它強(qiáng)制代碼生成器發(fā)出回寫以保持值一致,但是不可避免且相當(dāng)大的性能損失。

這是一個(gè)完整的巖石和一個(gè)艱難的地方。對(duì)于x86抖動(dòng),他們只是沒有嘗試解決問題。

英特爾在設(shè)計(jì)SSE指令集時(shí)沒有犯同樣的錯(cuò)誤。XMM寄存器可自由尋址,不存儲(chǔ)額外的位。如果您想要一致的結(jié)果,那么使用AnyCPU目標(biāo)和64位操作系統(tǒng)進(jìn)行編譯是快速解決方案。x64抖動(dòng)使用SSE而不是FPU指令進(jìn)行浮點(diǎn)數(shù)學(xué)運(yùn)算。雖然這增加了計(jì)算可以產(chǎn)生不同結(jié)果的第三種方式。如果計(jì)算錯(cuò)誤,因?yàn)樗鼇G失了太多有效數(shù)字,那么它將一直是錯(cuò)誤的。實(shí)際上,這有點(diǎn)像溴化物,但通常只有程序員看起來。


查看完整回答
反對(duì) 回復(fù) 2019-08-19
  • 2 回答
  • 0 關(guān)注
  • 551 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

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