为什么锈没有实现通过奥德特征为F64和F32全序?为什么锈没有实现通过奥德特征为F64和F32全序?

2019-05-12 09:57发布

虽然锈的所有整数类型实现Ord强调总排序,浮点类型仅实现PartialOrd 。 这意味着,有可能是其无法比拟的浮点值。 这似乎是难以消化的,因为浮点数字可以被看作是近似而它们恰巧是一个完全有序的实数集。 即使加正,负无穷大的保持实数集的全序。 为什么这样奇怪的选择拉斯特?

这一限制意味着一个通用的排序/搜索算法只能假设在数字部分排序。 IEEE 754标准似乎提供了一个全序的谓词 。

为NaN的这么多的通用代码的问题?

Answer 1:

你的问题是,恰恰? 你问的NaN是否存在,或者是否可以作为意外或自愿计算的结果来获得? 是的,它和它可以。 需要对键的总体顺序排序的数据结构的分解完全,当提供的顺序是不是总订单。 你不想甚至一个特殊的价值是由它本身的不同,因为它会破坏结构的不变量,并意味着任何事情都有可能发生的今后。 楠不是应该被假定为无害的,只要没有问题,已经显示出,尽管已在其他语言中被尝试 。

IEEE 754的普通的比较操作符的定义<<= ,......使他们非常有用的一般-如果不是当你需要一个总订单。 特别是,它是很容易编写的条件,使NaN的输入将被发送到错误的分支:

if (!(x <= MAX)) { // NaN makes this condition true
  error();
}

if (!(x >= MIN)) { // NaN makes this condition true
  error();
}

因为<<=是如此有用,它们是从IEEE 754在现代处理器-的单,快捷指令实现totalOrder谓词的操作通常不以硬件实现。 编程语言的语言映射到结构的快速指示,离开任何人谁格外需要totalOrder从库中挑选,或甚至定义它自己。



文章来源: Why does Rust not implement total ordering via the Ord trait for f64 and f32?