繁体   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