The base assumption is that min(a, b) == min(b, a), and same for max.
This is not true when values are not comparable (= when PartialOrd::partial_cmp would return None) because, in that case, these two methods always return the right hand side.
In other words, a.simd_min(b) == b but b.simd_min(a) == a when a.partial_cmp(b) == None.
This happens, for instance, when comparing a regular f32 and f32::NAN:
let number = 1.0f32;
let nan = f32::NAN;
println!("{}", number.simd_min(nan)); // Prints "NaN"
println!("{}", nan.simd_min(number)); // Prints "1"
This happens because the current implementation of simd_min is the following:
fn simd_min(self, other: Self) -> Self {
if self <= other {
self
} else {
other
}
}
and a <= (or any syntax-sugared comparison in general) between two instances PartialOrd where a.partial_ord(&b) returns None is evaluated to false.
The base assumption is that
min(a, b) == min(b, a), and same formax.This is not true when values are not comparable (= when
PartialOrd::partial_cmpwould returnNone) because, in that case, these two methods always return the right hand side.In other words,
a.simd_min(b) == bbutb.simd_min(a) == awhena.partial_cmp(b) == None.This happens, for instance, when comparing a regular
f32andf32::NAN:This happens because the current implementation of
simd_minis the following:and a
<=(or any syntax-sugared comparison in general) between two instancesPartialOrdwherea.partial_ord(&b)returnsNoneis evaluated tofalse.