我有分区测试,我有时需要检查我的结果是NaN
还是inf
,但看起来Rust不认为NaN等于NaN:
fn main() {
let nan = "NaN".parse::<f64>().unwrap();
println!("{:?}", nan);
println!("{:?}", nan == nan);
} // NaN false
如何比较包含NaN和无穷大的两个向量,看它们是否相等?
答案 0 :(得分:5)
NaN
比较不等。如果你想做一些不同的事情,你必须自己定义比较。这不太难;迭代器方法为您完成大部分工作:
fn eq_with_nan_eq(a: f64, b: f64) -> bool {
(a.is_nan() && b.is_nan()) || (a == b)
}
fn vec_compare(va: &[f64], vb: &[f64]) -> bool {
(va.len() == vb.len()) && // zip stops at the shortest
va.iter()
.zip(vb)
.all(|(a,b)| eq_with_nan_eq(*a,*b))
}
fn main() {
use std::f64::NAN;
let a = vec![0f64, 1.0, NAN];
let b = vec![0f64, 2.0, NAN];
let c = vec![0f64, 1.0, NAN, 4.0];
let d = vec![0f64, 1.0, 3.0];
assert_eq!(vec_compare(&a, &b), false);
assert_eq!(vec_compare(&a, &a), true);
assert_eq!(vec_compare(&a, &d), false);
assert_eq!(vec_compare(&a, &c), false);
}
答案 1 :(得分:4)
您可能对is_nan
方法感兴趣。
assert!(nan.is_nan());