浮點(diǎn)數(shù)學(xué)在C#中是一致的嗎?可以嗎?不,這不是另一個(gè)“為什么(1/3.0)*3!=1”問題。最近我讀了很多關(guān)于浮點(diǎn)數(shù)的文章,特別是,相同的計(jì)算可能會(huì)給出不同的結(jié)果。在不同的架構(gòu)或優(yōu)化設(shè)置上。對(duì)于存儲(chǔ)重播的電子游戲來說,這是一個(gè)問題。點(diǎn)對(duì)點(diǎn)聯(lián)網(wǎng)(相對(duì)于服務(wù)器-客戶機(jī)),每次運(yùn)行程序時(shí),所有客戶端都會(huì)產(chǎn)生完全相同的結(jié)果-一個(gè)浮點(diǎn)計(jì)算中的微小差異可能會(huì)導(dǎo)致不同機(jī)器上的游戲狀態(tài)(甚至是完全不同的游戲狀態(tài))。在同一臺(tái)機(jī)器上!)即使在“跟隨”處理器中也會(huì)發(fā)生這種情況。IEEE-754,主要是因?yàn)橐恍┨幚砥?即x86)使用雙擴(kuò)展精度..也就是說,他們使用80位寄存器來做所有的計(jì)算,然后截?cái)嗟?4位或32位,導(dǎo)致與使用64位或32位的機(jī)器不同的四舍五入結(jié)果。我在網(wǎng)上看到了幾種解決這個(gè)問題的方法,但都是針對(duì)C+的,而不是C#:禁用雙擴(kuò)展精度模式(使所有double計(jì)算使用IEEE-754 64位)_controlfp_s(窗戶)_FPU_SETCW(Linux?)fpsetprec(BSD)。始終使用相同的優(yōu)化設(shè)置運(yùn)行相同的編譯器,并要求所有用戶具有相同的CPU架構(gòu)(沒有跨平臺(tái)播放)。因?yàn)槲业摹熬幾g器”實(shí)際上是JIT,它每次運(yùn)行程序時(shí)都可能以不同的方式進(jìn)行優(yōu)化。我不認(rèn)為這是可能的。使用定點(diǎn)算法,避免float和double總之。decimal將為此目的工作,但速度要慢得多,而且沒有一個(gè)System.Math圖書館功能支持它。所以,這在C#中是一個(gè)問題嗎?如果我只打算支持Windows(而不是Mono)呢?如果是的話,有沒有辦法強(qiáng)迫我的程序以正常的雙精度運(yùn)行?如果不是,有沒有圖書館能幫上忙保持浮點(diǎn)計(jì)算一致?
3 回答

滄海一幻覺
TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊
- 3 回答
- 0 關(guān)注
- 397 瀏覽
添加回答
舉報(bào)
0/150
提交
取消