我有以下关闭。
let ss = aa.iter().fold(0., |sum: f32,x| if *x != f32::NAN { sum + e } else { sum + 0. })
Run Code Online (Sandbox Code Playgroud)
我试图对向量中省略的所有值求和(向量中f32::NAN有几个值)。NaN
但是,我的回报给了我NaN价值,因为我的条件if *x != f32::NAN似乎并不有效。因为,下面的闭包会产生原始向量而不是省略NaN值。
let bb = aa.iter().filter(|x| **x != f32::NAN).map(|x| x)
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何匹配条件f32::NAN中的值if?从更广泛的角度来看,如何省略NaN向量中的值?
您不能以这种方式检查 NaN,因为NaN == NaN计算结果为false。f32::is_nan代替使用。此外,您可以使用Iterator::filter过滤掉迭代器的元素并对Iterator::sum所有值求和。
这会产生以下代码(Playground):
let aa = [3.14f32, std::f32::NAN, 2.71, 27.99];
let ss = aa.iter()
.filter(|n| !n.is_nan())
.sum::<f32>();
println!("{}", ss);
Run Code Online (Sandbox Code Playgroud)