3 回答

TA貢獻1827條經驗 獲得超8個贊
英特爾x86處理器內部使用80位擴展精度,而double通常為64位寬。不同的優化級別會影響來自CPU的浮點值保存到內存的頻率,從而從80位精度四舍五入到64位精度。
使用-ffloat-storegcc選項可獲得具有不同優化級別的相同浮點結果。
或者,使用long double通常在gcc上為80位寬的類型,以避免精度從80位舍入到64位。
man gcc 全部說明:
-ffloat-store
Do not store floating point variables in registers, and inhibit
other options that might change whether a floating point value is
taken from a register or memory.
This option prevents undesirable excess precision on machines such
as the 68000 where the floating registers (of the 68881) keep more
precision than a "double" is supposed to have. Similarly for the
x86 architecture. For most programs, the excess precision does
only good, but a few programs rely on the precise definition of
IEEE floating point. Use -ffloat-store for such programs, after
modifying them to store all pertinent intermediate computations
into variables.

TA貢獻1844條經驗 獲得超8個贊
輸出應為:4.5 4.6如果您具有無限精度,或者正在使用使用基于十進制而不是基于二進制的浮點表示的設備,那么輸出就是這樣。但是,事實并非如此。大多數計算機使用二進制IEEE浮點標準。
正如Maxim Yegorushkin在回答中指出的那樣,部分問題是計算機內部使用的是80位浮點表示形式。不過,這只是問題的一部分。問題的基礎是n.nn5形式的任何數字都沒有確切的二進制浮點表示形式。這些極端情況總是不精確的數字。
如果您確實希望舍入能夠可靠地舍入這些極端情況,則需要一種舍入算法來解決以下事實:n.n5,n.nn5或n.nnn5等(而不是n.5)始終是不精確。找到確定某些輸入值是向上舍入還是向下舍入的特殊情況,并根據與該特殊情況的比較返回四舍五入后的值。而且,您確實需要注意,優化的編譯器不會將找到的特殊情況放入擴展的精度寄存器中。
請參閱即使不精確,Excel如何如何成功舍入浮點數?對于這樣的算法。
或者,您可以忍受極端情況有時會錯誤舍入的事實。

TA貢獻1942條經驗 獲得超3個贊
不同的編譯器具有不同的優化設置。根據IEEE 754的規定,某些較快的優化設置未維護嚴格的浮點規則。Visual Studio中有一個特定的設置,/fp:strict
,/fp:precise
,/fp:fast
,其中/fp:fast
違反了什么可以做標準。您可能會發現,此標志是控制此類設置中的優化的因素。您可能還會在GCC中找到類似的設置,該設置會更改行為。
如果是這種情況,則編譯器之間的唯一不同之處在于,默認情況下,GCC會在更高的優化條件下尋找最快的浮點行為,而Visual Studio不會在更高的優化級別下更改浮點行為。因此,它不一定是實際的錯誤,而是您不知道要打開的選項的預期行為。
- 3 回答
- 0 關注
- 649 瀏覽
添加回答
舉報