我可以知道Double.MIN_NORMAL(在1.6中引入)和Double.MIN_VALUE之间的区别是什么?
JavaDoc Double.MIN_NORMAL:
保持类型最小正正常值的常数
Double.MIN_VALUE,2 -1022
JavaDoc Double.MIN_NORMAL:
保持最小正非零值类型的常量
Double.MIN_VALUE,2 -1074
如果你有,Vec<u32>你会使用该slice::binary_search方法.
由于我不理解的原因,f32并且f64没有实施Ord.由于基本类型来自标准库,因此您无法Ord自己实现它们,因此您似乎无法使用此方法.
你怎么能有效地做到这一点?
我真的必须包装f64一个包装器结构并Ord在其上实现吗?这样做似乎非常痛苦,并且涉及大量transmute不安全地来回传播数据块,实际上是没有理由的.
我想使用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上进行二进制搜索?并且这个问题的共同点是实现浮点数的总排序和相等,不同之处仅在于散列或迭代.
我师,在那里我有时需要检查我的结果要么是一个测试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和无穷大的两个向量,看它们是否相等?
我理解为什么浮点数没有实现,Ord但是当我想要懒惰并使用迭代器时,这对我没有特别的帮助.
是否有一种解决方法或一种简单的方法来获取包含浮点数的迭代器的最小值/最小值/ min_by?
我知道可以排序(这很慢)或将其包装在另一种类型中并实现所需的交易(这是冗长的),但我希望有一些更优雅的东西.