說我有兩個有理分數a/b和c/d是相等的。 a,b,c和d都可以表示爲32位有符號整數。如果我用64位浮點數進行分割,總是會出現a/b == c/d?浮點穩定性
浮點穩定性
回答
在某些情況下,即使結果保證一致,編譯器優化也會阻止相等性爲真。原始的x86浮點運算是在80位寄存器上執行的;如果將其中一個與存儲的64位值進行比較,它可能會比較不等。
如果能夠看到一些能夠顯示這個問題的代碼,那就太好了。我試過在java中這樣做,似乎無法強制與80位值的64位比較。 – benmmurphy
英特爾目標有多個編譯器,它們並不全都實現具有80位值的浮點運算。 –
@EricPostpischil,你是對的 - 現代編譯器可以使用SSE實現浮點運算,並完全避免使用80位寄存器。自從問到「總是」的問題時,我覺得只有一個反例就足夠了。 –
- 1. 測量浮點數列表的波動性或穩定性
- 2. Google雲端點穩定性?
- 3. Silverlight穩定性
- 4. Parse.com穩定性
- 5. 無法與穩定性穩定
- 6. 定義浮點值特性
- 7. C++ DLL浮點確定性
- 8. System.Data.SQLite的穩定性
- 9. 穩定性模式
- 10. 數值穩定性
- 11. 在使用浮點數時避免不穩定的小數字
- 12. 理性浮點
- 13. 定點到浮點
- 14. C#定點浮點
- 15. numpy的FFT穩定性
- 16. SQLCipher的穩定性Android
- 17. 穩定性的影響
- 18. 最低穩定性問題
- 19. xDebug穩定性問題
- 20. 查詢性能不穩定
- 21. mod_mono穩定性問題
- 22. Django幹線穩定性
- 23. SignalR性能不穩定
- 24. Double googlemap穩定性問題
- 25. JSF 2.0穩定性問題
- 26. Websocket穩定性問題
- 27. WPF的穩定性如何?
- 28. C++算法的穩定性
- 29. NSubstitute的穩定性如何?
- 30. Flex 4的不穩定性
如果您正在測試相等性,則可以使用64位*整數*並將(a * d)與(b * c)進行比較,並避免整個浮點舍入問題。例如 – cHao
1/2和3/6會有所不同。 – Fakrudeen
1/2和3/6不會有區別,他們爲什麼會這樣?無論使用什麼精度,它們都將精確地(1/2)(浮點雙倍擴展...)。 double(1)/ double(3)和double(5)/ double(15)也會導致與num.and den相同的結果。完全轉換,IEEE /是這樣的結果是精確的分數四捨五入四捨五入規則(和模式)。如果使用中間擴展精度,則第二個舍入會執行double ... double(1/extended(3))可能不同於1/double(3)...如果兩個分數都通過相同的舍入階段,結果應該是一樣的。 –