2012-08-27 64 views
3

說我有兩個有理分數a/b和c/d是相等的。 a,b,c和d都可以表示爲32位有符號整數。如果我用64位浮點數進行分割,總是會出現a/b == c/d?浮點穩定性

+4

如果您正在測試相等性,則可以使用64位*整數*並將(a * d)與(b * c)進行比較,並避免整個浮點舍入問題。例如 – cHao

+0

1/2和3/6會有所不同。 – Fakrudeen

+0

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)...如果兩個分數都通過相同的舍入階段,結果應該是一樣的。 –

回答

4

在某些情況下,即使結果保證一致,編譯器優化也會阻止相等性爲真。原始的x86浮點運算是在80位寄存器上執行的;如果將其中一個與存儲的64位值進行比較,它可能會比較不等。

+0

如果能夠看到一些能夠顯示這個問題的代碼,那就太好了。我試過在java中這樣做,似乎無法強制與80位值的64位比較。 – benmmurphy

+0

英特爾目標有多個編譯器,它們並不全都實現具有80位值的浮點運算。 –

+0

@EricPostpischil,你是對的 - 現代編譯器可以使用SSE實現浮點運算,並完全避免使用80位寄存器。自從問到「總是」的問題時,我覺得只有一個反例就足夠了。 –