此處的 gcc 檔案解釋了 FE_TONEAREST 的作用:
這是默認模式。除非對其他其中之一有特殊需要,否則應該使用它。在這種模式下,結果將四舍五入到最接近的可表示值。如果結果介于兩個可表示值之間,則選擇偶數可表示值。即使在這里也意味著最低位為零。
現在,考慮以下示例:
printf("%.2f\n", 1.235); // nearest are 1.23 and 1.24, 1.24 should be chosen
printf("%.2f\n", 1.225); // nearest are 1.22 and 1.23, 1.22 should be chosen
根據檔案,我希望獲得1.24和1.22. 相反,我得到1.24和1.23。
我錯過了什么?
uj5u.com熱心網友回復:
1.235 和 1.225 不是您程式中的數字。
您的 C 實作幾乎肯定使用 IEEE-754 “雙精度”格式double,也稱為 binary64。如果它正確舍入轉換為最接近的可表示值,則源文本1.235將轉換為double1.2350000000000000976996261670137755572795867919921875。將printf其轉換為帶兩位小數的十進制數字時,沒有平局;它高于 1.235,因此結果是數字“1.24”。
源文本1.225轉換為double1.225000000000000088817841970012523233890533447265625。將printf其轉換為帶兩位小數的十進制數字時,沒有平局;它高于 1.225,因此結果是數字“1.23”。
uj5u.com熱心網友回復:
如果你列印小數點后 17 位,你會得到:
1.23500000000000010
1.22500000000000009
所以兩者都比“預期的”十進制表示略多,所以都向上取整。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/438736.html
上一篇:模板化已經模板化的基類的派生類
