似乎IEEE 754标准将16,777,214个32位浮点值定义为NaN,或所有可能值的0.4%.
我想知道保留这么多有用值的理由是什么,而基本上只需要2个:一个用于信令,一个用于安静的NaN.
对不起,如果这个问题很简单,我在互联网上找不到任何解释.
如果你有,Vec<u32>你会使用该slice::binary_search方法.
由于我不理解的原因,f32并且f64没有实施Ord.由于基本类型来自标准库,因此您无法Ord自己实现它们,因此您似乎无法使用此方法.
你怎么能有效地做到这一点?
我真的必须包装f64一个包装器结构并Ord在其上实现吗?这样做似乎非常痛苦,并且涉及大量transmute不安全地来回传播数据块,实际上是没有理由的.
我师,在那里我有时需要检查我的结果要么是一个测试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无法用C++比较器对象的特性完成同样的事情.以简化更复杂的方案为例:
int epsilon = 0.001;
auto less = [epsilon](const double a, const double b) {
if (fabs(a - b) > epsilon) {
return a < b;
}
else {
return false;
}
};
std::map<float, int, decltype(less)> myMap(less);
myMap.insert(std::make_pair(1.0, 1));
myMap.insert(std::make_pair(2.0, 2));
myMap.insert(std::make_pair(3.0, 3));
auto found = myMap.find(1.0001);
assert(found != myMap.end());
assert(found->second == 1);
Run Code Online (Sandbox Code Playgroud)
我想比较器有一些运行时上下文,比如epsilon值.我无法弄清楚你将如何做到这一点,BTreeMap因为我不能添加状态到Ord特征.是否有一些技术我还没想到要做同等的事情?
编辑
我的例子中有一个拼写错误,使我无法意识到C++实际上并没有起作用.我正在重新评估这个问题.