如何检查向量是否等于包含NaN和inf的另一个向量?

The*_*Cat 5 rust

我师,在那里我有时需要检查我的结果要么是一个测试NaNinf,但它似乎是锈不考虑为NaN等于楠:

fn main() {
    let nan = "NaN".parse::<f64>().unwrap();
    println!("{:?}", nan);
    println!("{:?}", nan == nan);
} // NaN false
Run Code Online (Sandbox Code Playgroud)

如何比较含有NaN和无穷大的两个向量,看它们是否相等?

Mat*_* M. 7

您可能对该is_nan方法感兴趣。

assert!(nan.is_nan());
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 6

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);
}
Run Code Online (Sandbox Code Playgroud)

操场