Rust f64/f32的圆形是否正确



在最近与同事讨论了数学舍入后,我们分析了不同语言的舍入。

例如:

  • MATLAB:";将离零的一半取整">
  • Python:";将一半圆到偶数">

我不会说其中一个是正确的,另一个不是,但让我困扰的是Rust Book中的写作和文档中关于round函数的内容的结合。

书1:

浮点数字是根据IEEE-754标准表示的。f32类型是单精度浮点,而f64具有双精度。

文档2:

返回最接近self的整数。从0.0取整一半大小写。

我担心的是IEEE-754的标准舍入是";将一半圆到偶数;。

我问过的大多数大学生倾向于使用和学习"大部分/仅";将离零的一半取整";当我想出不同的取整策略时,他们实际上很困惑。铁锈的开发者是否因为可能与IEEE标准混淆而做出决定?

没有人反对IEEE-754,IEEE-754定义了五种不同的有效舍入方法。

与此问题相关的两种方法被称为最近四舍五入

  • 舍入到最近值,平局到偶数–舍入到最近的值;如果数字落在中间,则会使用最低有效位数将其四舍五入到最接近的值
  • 四舍五入到最近值,远离零(或远离零(-四舍五进到最近值;如果数字落在中间,则四舍五入到上面(对于正数(或下面(对于负数(的最接近值

Python采用第一种方法,Rust采用第二种方法。两者都与IEEE-754标准相矛盾,后者定义并允许两者。

其他三种是我们可能更通俗地称之为截断的东西,即总是向下取整,或者总是向上取整,或总是向零取整。

您引用的文档用于显式函数round

IEEE-754指定浮点运算的默认舍入方法应该是四舍五入到最近值,平局到偶数(在特殊情况下进行一些修饰(。舍入方法指定如何(从概念上(将函数或运算的数学结果调整为以浮点格式表示的数字。它不适用于函数计算的函数。

roundfloortrunc这样的函数用于根据参数计算特定的整数。他们执行的数学计算是为了确定该整数。四舍五入规则仅适用于在浮点类型中无法表示理想数学结果时确定返回的浮点结果。

例如,sin(x)被定义为返回计算结果,如同:

  • x的正弦被精确地测定,具有"无限"的精度
  • 然后,根据舍入方法,将该正弦舍入为以浮点格式表示的数字

类似地,round(x)可以被认为被定义为返回计算结果,就像一样

  • 精确地确定了x的最近整数,该整数从零四舍五入到一半,精度为"无限">
  • 然后,根据舍入方法,将最接近的整数舍入为以浮点格式表示的数字

然而,由于例程的性质,第二步从来都不是必需的:最接近的整数总是可表示的,所以四舍五入永远不会改变它。(除此之外,您可能有指数范围有限的异常浮点格式,因此四舍五入确实会产生一个不可表示的整数。例如,在一个有四位有效位但指数范围将数字限制为小于4的格式中,将3.75舍五入到最接近的整数会产生4,但这是不可代表的,因此必须返回+∞。我不能说我见过在这种情况下,在round函数的规范中明确提及。(

最新更新