![](/img/trans.png)
[英]Why does Rust not implement total ordering via the Ord trait for f64 and f32?
[英]Does Rust f64/f32 round correctly?
在最近與我的同事討論了數學舍入之后,我們分析了不同語言的舍入。
例如:
我不會說一個是正確的或另一個不是,但困擾我的是 Rust 書中的文字和文檔中關於round
function 的內容的組合。
書1 :
浮點數根據 IEEE-754 標准表示。 f32 類型為單精度浮點數,f64 為雙精度。
文檔2 :
將最近的 integer 返回給自己。 從 0.0 舍入中途案例。
我擔心的是 IEEE-754 的標准舍入是“四舍五入”。
我問的大多數同事傾向於使用和學習主要/僅“從零取整一半”,當我想出不同的取整策略時,他們實際上感到困惑。 rust 的開發人員是否因為可能與 IEEE 標准混淆而決定?
沒有人反對 IEEE-754,它定義了五種不同的有效舍入方法。
與此問題相關的兩種方法稱為最接近舍入。
- 四舍五入到最接近的值,與偶數相關——四舍五入到最接近的值; 如果該數字在中途下降,則將其四舍五入到具有偶數最低有效數字的最接近的值。
- 舍入到最近,從零開始(或從零開始)——四舍五入到最接近的值; 如果數字在中途下降,則將其四舍五入到最接近的值高於(對於正數)或低於(對於負數)。
Python 采用第一種方法,Rust 采用第二種方法。 兩者都不與 IEEE-754 標准相矛盾,該標准定義並允許兩者。
其他三個是我們可能更通俗地稱為截斷的東西,即總是向下舍入,或總是向上舍入,或總是向零舍入。
您引用的文檔是針對明確的 function, round
。
IEEE-754 指定浮點運算的默認舍入方法應該是四舍五入到最接近、平到偶數(對不尋常的情況進行一些修飾)。 舍入方法指定如何(在概念上)將 function 的數學結果或運算調整為以浮點格式表示的數字。 它不適用於函數計算的函數。
存在諸如round
、 floor
和trunc
之類的函數來根據參數計算特定的 integer。 他們執行的數學計算是確定 integer。 當理想的數學結果不能以浮點類型表示時,舍入規則僅適用於確定要返回的浮點結果。
例如, sin(x)
被定義為返回計算結果,如下所示:
x
的正弦以“無限”精度精確確定。 類似地,可以認為round(x)
被定義為返回一個計算結果,如下所示:
x
的最接近的 integer 以“無限”精度精確確定,從零開始舍入一半大小寫。 但是,由於例程的性質,永遠不需要第二步:最近的 integer 始終是可表示的,因此舍入永遠不會改變它。 (除了,您可能具有指數范圍有限的異常浮點格式,因此向上舍入確實會產生無法表示的 integer。例如,在具有四位有效數但指數范圍限制數字小於 4 的格式中,四舍五入 3.75到最近的 integer 將產生 4,但這是不可表示的,因此必須返回 +∞。我不能說我曾見過這種情況在round
的規范中明確解決。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.