2016-11-23 9 views
2

私は時々私の結果は、どちらかNaNまたはinfていることを確認する必要がありますが、錆がNaN NaNに等しくなるように考慮されていないようにそれはそう分裂のテスト、持っている:私はどのように比較するかベクトルがNaNとinfを含む別のベクトルと等しいかどうかを確認するにはどうすればよいですか?

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

をそれらが等しいかどうかを見るためにNaNと無限大を含む2つのベクトル?

+1

のNaN/infファイルがある場合は、結果は何になりたいですか –

+1

[IEEE浮動小数点演算へようこそ](http://floating-point-gui.de/)。 **定義**、 'NaN'!=' NaN'、これはRust特有のものではありません。また、[NaN'値の[* millions *](http://stackoverflow.com/q/19800415/155423)のどちらを同等にしたいですか? – Shepmaster

+2

FYI、['NAN'定数](https://doc.rust-lang.org/std/f64/constant.NAN.html)があります。解析する必要はありません。 – Shepmaster

答えて

4

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); 
} 

Playground

4

is_nanメソッドに興味があるかもしれません。

assert!(nan.is_nan()); 
関連する問題