簡體   English   中英

Rust f64/f32 是否正確舍入?

[英]Does Rust f64/f32 round correctly?

在最近與我的同事討論了數學舍入之后,我們分析了不同語言的舍入。

例如:

  • MATLAB:“距離零的一半”
  • Python:“四舍五入到偶數”

我不會說一個是正確的或另一個不是,但困擾我的是 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 的數學結果或運算調整為以浮點格式表示的數字。 它不適用於函數計算的函數。

存在諸如roundfloortrunc之類的函數來根據參數計算特定的 integer。 他們執行的數學計算是確定 integer。 當理想的數學結果不能以浮點類型表示時,舍入規則僅適用於確定要返回的浮點結果。

例如, sin(x)被定義為返回計算結果,如下所示:

  • x的正弦以“無限”精度精確確定。
  • 然后根據舍入方法將該正弦四舍五入為可以以浮點格式表示的數字。

類似地,可以認為round(x)被定義為返回一個計算結果,如下所示:

  • x的最接近的 integer 以“無限”精度精確確定,從零開始舍入一半大小寫。
  • 然后根據舍入方法將最接近的 integer 舍入為可以以浮點格式表示的數字。

但是,由於例程的性質,永遠不需要第二步:最近的 integer 始終是可表示的,因此舍入永遠不會改變它。 (除了,您可能具有指數范圍有限的異常浮點格式,因此向上舍入確實會產生無法表示的 integer。例如,在具有四位有效數但指數范圍限制數字小於 4 的格式中,四舍五入 3.75到最近的 integer 將產生 4,但這是不可表示的,因此必須返回 +∞。我不能說我曾見過這種情況在round的規范中明確解決。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM