似乎IEEE 754标准将16,777,214个32位浮点值定义为NaN,或所有可能值的0.4%.
我想知道保留这么多有用值的理由是什么,而基本上只需要2个:一个用于信令,一个用于安静的NaN.
对不起,如果这个问题很简单,我在互联网上找不到任何解释.
我想获得在 Rust 中对 a 进行排序的索引Vec。实际上,我想argsort()从 numpy.
例如:
let v = vec![1, 7, 4, 2];
let i = argsort(&v);
assert_eq!(i, &[0, 3, 2, 1]);
Run Code Online (Sandbox Code Playgroud) 这是一个简单的问题,我正在编写一个返回多个浮点数最大值的函数,std::cmp::max给我:
the trait bound `{float}: std::cmp::Ord` is not satisfied
Run Code Online (Sandbox Code Playgroud)
我是否需要为每个项目都写这个:
macro_rules! max {
($x: expr) => ($x);
($x: expr, $($z: expr),+) => {{
let y = max!($($z),*);
if $x > y {
$x
} else {
y
}
}}
}
Run Code Online (Sandbox Code Playgroud)
那么获得多个浮点数最大值的推荐方法是什么?
我想使用a HashMap<f64, f64>,用于将已知x和y的点的距离保存到另一个点.f64因为价值在这里无关紧要,重点应放在关键上.
let mut map = HashMap<f64, f64>::new();
map.insert(0.4, f64::hypot(4.2, 50.0));
map.insert(1.8, f64::hypot(2.6, 50.0));
...
let a = map.get(&0.4).unwrap();
Run Code Online (Sandbox Code Playgroud)
由于f64既不是Eq也不是Hash,只是PartialEq,f64不足以作为重点.我需要先保存距离,但也要稍后通过y访问距离.y的类型需要是浮点精度,但如果不起作用f64,我将使用i64带有已知指数的.
我通过使用自己的方法尝试了一些hacks struct Dimension(f64),然后Hash通过将float转换为a String然后对其进行哈希来实现.
#[derive(PartialEq, Eq)]
struct DimensionKey(f64);
impl Hash for DimensionKey {
fn hash<H: Hasher>(&self, state: &mut H) {
format!("{}", self.0).hash(state);
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎非常糟糕,两个解决方案,我自己的struct或float作为带有base和exponent的整数似乎对于一个键来说非常复杂.
更新:我可以保证我的密钥永远不会是NaN,或者是无限的价值.此外,我不会计算我的密钥,只是迭代它们并使用它们.因此,已知错误应该没有错误0.1 + 0.2 ? 0.3.
如何在Vec of Floats上进行二进制搜索?并且这个问题的共同点是实现浮点数的总排序和相等,不同之处仅在于散列或迭代.
基于答案(导致std::cmp 函数),这里是工作游乐场
问题:
我尝试获取 Vec 的最小值/最大值。
由于 f64 有 NAN 和 Infinity,它不满足 Ord 并抱怨:
the trait `Ord` is not implemented for `f64`
Run Code Online (Sandbox Code Playgroud)
对于 NAN / Inf 从未包含在 Vec 中的情况,我怎样才能获得最小值/最大值?
我师,在那里我有时需要检查我的结果要么是一个测试NaN或inf,但它似乎是锈不考虑为NaN等于楠:
fn main() {
let nan = "NaN".parse::<f64>().unwrap();
println!("{:?}", nan);
println!("{:?}", nan == nan);
} // NaN false
Run Code Online (Sandbox Code Playgroud)
如何比较含有NaN和无穷大的两个向量,看它们是否相等?
假设 -该Vec<f32>不会不具有任何NaN价值或表现出任何NaN行为.
采取以下样本集:
0.28
0.3102
0.9856
0.3679
0.3697
0.46
0.4311
0.9781
0.9891
0.5052
0.9173
0.932
0.8365
0.5822
0.9981
0.9977
Run Code Online (Sandbox Code Playgroud)
获取上述列表中最高值索引的最新且最稳定的方法是什么(值可以是负数)?
我最初的尝试大致如下:
let _tmp = *nets.iter().max_by(|i, j| i.partial_cmp(j).unwrap()).unwrap();
let _i = nets.iter().position(|&element| element == _tmp).unwrap();
Run Code Online (Sandbox Code Playgroud)
哪里nets是&Vec<f32>.对我来说,这显然是不正确的.
相当于Python的Python(考虑到上面的假设):
_i = nets.index(max(nets))
Run Code Online (Sandbox Code Playgroud) 我想使用基于某个键max_by_key从f64s的向量中获取最大值。这是一个简单的例子,用一个小向量abs作为关键:
let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)
但是,由于f64没有实现Ord,我得到
let a: Vec<f64> = vec![-3.0, 0.2, 1.4];
*a.iter().max_by_key(|n| n.abs()).unwrap()
Run Code Online (Sandbox Code Playgroud)
同样,sort_by_key失败并出现相同的错误:
a.sort_by_key(|n| n.abs())
Run Code Online (Sandbox Code Playgroud)
我知道我可以绕过偏序限制来对浮点数向量进行排序 sort_by
b.sort_by(|m, n| m.partial_cmp(n).unwrap_or(Less))
Run Code Online (Sandbox Code Playgroud)
但这必须在一个向量上调用b,我已经abs为 的每个元素计算了键(在这种情况下)a,然后我必须返回并找到 的相应元素a,这看起来既复杂又缓慢。随着列表中项目数量的增加,我想尽量减少通过数据的次数。
有什么解决方法吗?
对于具有可以比较的多个成员的结构或者sort_by回调,将数据与优先级进行比较是很常见的.
// Example of sorting a: Vec<[f64; 2]>, sort first by y, then x,
xy_coords.sort_by(
|co_a, co_b| {
let ord = co_a[1].cmp(&co_b[1]);
if ord != std::cmp::Ordering::Equal {
ord
} else {
co_a[0].cmp(&co_b[0])
}
}
);
Run Code Online (Sandbox Code Playgroud)
是否有更简单的方法来执行多个cmp函数,其中只返回第一个不相等的结果?
当我想在整数和浮点数上调用min时,我该怎么办?例如,考虑一下:
fn foo<T>(v1: T, v2: T)
where ???
{
....
let new_min = min(v1, v2);
....
}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?