我理解why the floats don't have an implementation for Ord
,但当我想偷懒使用迭代器时,这对我没有特别的帮助。
有没有一种变通方法或简单的方法可以获取包含浮点数的迭代器的最小值/ min / min_by?
我知道你可以排序(这很慢)或者用另一种类型 Package 它,然后实现所需的交易(这很冗长),但我希望能有更优雅的东西。
我理解why the floats don't have an implementation for Ord
,但当我想偷懒使用迭代器时,这对我没有特别的帮助。
有没有一种变通方法或简单的方法可以获取包含浮点数的迭代器的最小值/ min / min_by?
我知道你可以排序(这很慢)或者用另一种类型 Package 它,然后实现所需的交易(这很冗长),但我希望能有更优雅的东西。
4条答案
按热度按时间szqfcxe21#
浮点数有它们自己的
min
和max
方法,可以一致地处理NaN,所以你可以折叠迭代器:打印
-10
。如果您想要不同的NaN处理方式,可以使用
PartialOrd::partial_cmp
。例如,如果您想要传播NaN,请使用以下命令折叠:j2cgzkjk2#
如果你知道你的数据不包含NaN,那么通过展开比较来Assert这个事实:
如果你的数据 * 可能 * 有NaN,你需要特别处理这种情况,一个解决方案是假设all 16,777,214 NaN values彼此相等,并且总是大于或小于其他数字:
有许多可用的板条箱可用于给予代码所需的任何语义。
您不应该*****使用
partial_cmp(b).unwrap_or(Ordering::Equal)
,因为当NaN存在时,它会提供不稳定的结果,但它会让读者认为它们已经得到处理:一个二个一个一个
nfg76nw03#
自Rust 1.62.0起,一个名为
.total_cmp()
的内置浮点数总排序比较方法现在是稳定的。它实现了IEEE 754中定义的总排序,每个可能的f64
位值都进行了不同的排序,包括正零和负零,以及所有可能的NaN。请注意,有些NaN排序在Infinity之上,有些NaN排序在-Infinity之下。因此,在NaN的存在下,“最大”值可能会混淆,但它将是一致的。Floats仍然不会实现
Ord
,所以它们不能直接排序,但是样板文件已经被削减到一行,没有任何外部导入或恐慌的机会:9fkzdhlc4#
像这样?
有一件事我很纠结,那就是
sort_by
会在适当的位置突变载体,因此您不能直接在链中使用它。