为什么Rust没有通过f64和f32的Ord特性实现总排序?

时间:2014-10-21 14:52:29

标签: sorting rust floating-point partial-ordering

虽然Rust实现Ord中的所有整数类型都强调总排序,但浮点类型只实现PartialOrd。这意味着可能存在无法比较的浮点值。这似乎很难消化,因为浮点数可以被认为是实数的近似值,恰好是一个完全有序的集合。即使增加正负无穷大也能保持实数的整数排序。为什么这个奇怪的选择在Rust?

此限制意味着通用排序/搜索算法只能假设对数字进行部分排序。 IEEE 754标准似乎提供了total ordering predicate

NaN在通用代码中有这么多问题吗?

1 个答案:

答案 0 :(得分:14)

你的问题是什么?您是在询问是否存在NaN,或者是否可以通过意外或自愿计算获得NaN?是的,它确实可以。当提供的订单不是总订单时,需要总订单的数据结构完全分解。你甚至不希望一个特殊的价值与它本身不同,因为它会打破结构的不变量,并意味着今后任何事情都可能发生。只要没有显示任何问题,NaN就不应该被认为是无害的,尽管that has been tried in other languages

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的人从库中选择它,甚至自己定义它。