似乎IEEE 754标准将16,777,214个32位浮点值定义为NaN,或所有可能值的0.4%.
我想知道保留这么多有用值的理由是什么,而基本上只需要2个:一个用于信令,一个用于安静的NaN.
对不起,如果这个问题很简单,我在互联网上找不到任何解释.
虽然Rust实现的所有整数类型Ord都强调总排序,但浮点类型只能实现PartialOrd.这意味着可能存在无法比较的浮点值.这似乎很难消化,因为浮点数可以被认为是实数的近似值,恰好是一个完全有序的集合.即使增加正负无穷大也能保持实数的整数排序.为什么这个奇怪的选择在Rust?
此限制意味着通用排序/搜索算法只能假设数字的部分排序.IEEE 754标准似乎提供了总排序谓词.
NaN在通用代码中是如此多的问题吗?
这是一个简单的问题,我正在编写一个返回多个浮点数最大值的函数,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)
那么获得多个浮点数最大值的推荐方法是什么?
基于答案(导致std::cmp 函数),这里是工作游乐场
问题:
我尝试获取 Vec 的最小值/最大值。
由于 f64 有 NAN 和 Infinity,它不满足 Ord 并抱怨:
the trait `Ord` is not implemented for `f64`
Run Code Online (Sandbox Code Playgroud)
对于 NAN / Inf 从未包含在 Vec 中的情况,我怎样才能获得最小值/最大值?
假设 -该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,这看起来既复杂又缓慢。随着列表中项目数量的增加,我想尽量减少通过数据的次数。
有什么解决方法吗?