当前位置: 首页 > 知识库问答 >
问题:

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

夹谷山
2023-03-14

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

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

NaN在通用代码中是个大问题吗?

共有2个答案

祁宝
2023-03-14

它不能,因为Rust的核心设计错误是将Ord作为PartialOrd的子类型。

这意味着,尽管浮点值具有总顺序,但在该层次结构中只能有一个实现;该实现使用比较谓词(它只是一个偏序),而不是总序谓词(它是一个总序(因此也是一个偏序))。

如果OrdPartialOrd是不相关的,那么从IEEE754规范中同时实现5.10和5.11将是微不足道的,但因为它们不生锈,所以必须选择一个,并且选择了5.11。

夹谷星河
2023-03-14

你的问题到底是什么?您是在问NaN是否存在,还是可以通过意外或自愿计算获得?是的,它可以,它可以。当提供的顺序不是总顺序时,需要键的总顺序的数据结构类型会完全崩溃。您甚至不希望一个异常值与它本身不同,因为它会破坏结构的不变量,意味着从此以后任何事情都可能发生。只要没有问题,NaN就不应该被认为是无害的,尽管在其他语言中已经尝试过。

IEEE 754对普通比较运算符的定义

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

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

因为<代码>

 类似资料:
  • 我想要一个方法,用于、和,因此我创建了一个trait: 我得到一个错误: 根据Rust标准库文档,未实现。为什么存在冲突的实现?

  • 我希望这能奏效: ...但它没有: 游戏Geofence:http://is.gd/kxDt0P 那么,发生了什么事? 我不知道这个错误是什么意思。 是因为我使用的是Result,而这要求U,V不是大小的吗?在这种情况下,它们的尺寸为何?我没有写: 所有泛型现在都是动态调整大小还是什么?(在这种情况下,大小是什么?甚至是什么意思?) 怎么回事啊?

  • 在的留档中,它说 实现必须与PartialOrd实现一致[…] 这当然是有道理的,并且可以很容易地归档,如下面的示例所示: 我想知道,为什么他们会把这个负担/风险留给我们用户,而不是用毯子 我在操场上测试了循环依赖和其他东西的问题,但这和我预期的一样有效。互联网也没有产生任何结果。 我能想到的另一个原因是宏现在是如何工作的。人们可能必须将每个替换为(或者将(PartialOrd)的宏变得更智能-我

  • 我有以下生锈代码: 我知道浮点运算可能很棘手,但我想知道这些技巧是否也会影响f64的打印和执行相等性检查。以下是上述代码的输出:

  • Rust的枚举是代数数据类型。据我所知,这似乎包含了struct是什么。struct有什么不同之处需要保留它?

  • 编译以下代码时: 我得到一个错误: 错误消息试图说明什么?还有,怎么修? 有一个相关的问题,但解决方案是修改特征<code>a</code>(在我的例子中对应于<code>可绘制</code>),但这在这里是不可能的,因为<code>可以绘制</code>来自外部库。