為什么False在.NET 4中打印此代碼?似乎是顯式強制轉(zhuǎn)換導致某些意外行為。除了“浮點數(shù)不準確”或“不要那樣做”之外,我想要一個答案。float a(float x, float y){ return ( x * y );}float b(float x, float y){ return (float)( x * y );}void Main(){ Console.WriteLine( a( 10f, 1f/10f ) == b( 10f, 1f/10f ) );}PS:此代碼來自單元測試,而不是發(fā)布代碼。該代碼是故意以這種方式編寫的。我懷疑它最終會失敗,但是我想確切地知道何時以及為什么。答案證明了此技術(shù)的有效性,因為它提供了一種超出對浮點確定性的通常理解的理解。這就是以這種方式編寫此代碼的目的;刻意探索。PPS:單元測試在.NET 3.5中通過,但是現(xiàn)在升級到.NET 4后失敗。
3 回答

慕田峪9158850
TA貢獻1794條經(jīng)驗 獲得超8個贊
我現(xiàn)在沒有Microsoft編譯器,Mono沒有這種效果。據(jù)我所知,GCC 4.3+使用gmp和mpfr在編譯時計算一些東西。C#編譯器可以對同一程序集中的非虛擬,靜態(tài)或私有方法執(zhí)行相同的操作。顯式強制轉(zhuǎn)換可能會干擾這種優(yōu)化(但是我看不出為什么它不能具有相同的行為)。也就是說,它可以內(nèi)聯(lián)到某種程度上計算常數(shù)表達式(b()例如,可能取決于類型轉(zhuǎn)換)。
如果有必要,GCC還具有將操作提升到更高精確度的優(yōu)化。
因此,我認為這兩種優(yōu)化都是潛在的原因。但是對于他們兩個,我都沒有理由對結(jié)果進行顯式強制轉(zhuǎn)換可能會具有一些其他含義,例如“更接近于標準”。

收到一只叮咚
TA貢獻1821條經(jīng)驗 獲得超5個贊
不管您想調(diào)用它是什么,都可以。就是很多人錯誤地或不完全地將此問題歸因于此。問題的重點是去了解“其他東西”。為此,需要對問題和答案進行編輯。我希望沒有人提到浮點“精度”的基礎知識,因為這個問題(正如Eric詳盡解釋的那樣)比通常所知的浮點“精度”更為復雜。這就是為什么僅對浮點“準確性”的評論仍被人們贊成的原因。
- 3 回答
- 0 關(guān)注
- 597 瀏覽
添加回答
舉報
0/150
提交
取消