相关疑难解决方法(0)

为什么IEEE 754保留了如此多的NaN值?

似乎IEEE 754标准将16,777,214个32位浮点值定义为NaN,或所有可能值的0.4%.

我想知道保留这么多有用值的理由是什么,而基本上只需要2个:一个用于信令,一个用于安静的NaN.

对不起,如果这个问题很简单,我在互联网上找不到任何解释.

floating-point nan ieee-754

40
推荐指数
2
解决办法
5835
查看次数

为什么Rust没有通过f64和f32的Ord特性实现总排序?

虽然Rust实现的所有整数类型Ord都强调总排序,但浮点类型只能实现PartialOrd.这意味着可能存在无法比较的浮点值.这似乎很难消化,因为浮点数可以被认为是实数的近似值,恰好是一个完全有序的集合.即使增加正负无穷大也能保持实数的整数排序.为什么这个奇怪的选择在Rust?

此限制意味着通用排序/搜索算法只能假设数字的部分排序.IEEE 754标准似乎提供了总排序谓词.

NaN在通用代码中是如此多的问题吗?

sorting floating-point partial-ordering rust

22
推荐指数
2
解决办法
2934
查看次数

多个浮点数的最大锈蚀?

这是一个简单的问题,我正在编写一个返回多个浮点数最大值的函数,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)

那么获得多个浮点数最大值的推荐方法是什么?

floating-point rust

11
推荐指数
0
解决办法
8901
查看次数

xy 未实现 Vec<f64> / 特征 `Ord` 的最小值/最大值

基于答案(导致std::cmp 函数),这里是工作游乐场

问题:
我尝试获取 Vec 的最小值/最大值。
由于 f64 有 NAN 和 Infinity,它不满足 Ord 并抱怨:

the trait `Ord` is not implemented for `f64`
Run Code Online (Sandbox Code Playgroud)

对于 NAN / Inf 从未包含在 Vec 中的情况,我怎样才能获得最小值/最大值?

rust

7
推荐指数
1
解决办法
7570
查看次数

获取片中最大或最小浮点值的索引或Rust中的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)

algorithm floating-point idiomatic rust

4
推荐指数
4
解决办法
2113
查看次数

在浮点数向量上使用 max_by_key

我想使用基于某个键max_by_keyf64s的向量中获取最大值。这是一个简单的例子,用一个小向量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,这看起来既复杂又缓慢。随着列表中项目数量的增加,我想尽量减少通过数据的次数。

有什么解决方法吗?

iterator vector max rust

3
推荐指数
1
解决办法
2761
查看次数