[英]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.