C++ 中的 NaN 为什么?
NaN in C++ why?
我正在尝试实现 K-nn 分类器。这个问题的一部分是获得从一个例子到另一个例子的欧氏距离。我在计算它时遇到问题,因为 sum
最后是 NaN。
问题出在这个代码块中:
for(int i=0;i<fdataset.size();i++){
float sum=0;
for(int k=0;k<fdataset[i].size();k++){
if(mask[k]){
sum+=(fdataset[i][k]-example[k])*(fdataset[i][k]-example[k]);
}
}
results[i]=sqrt(sum);
}
fdataset
是 vector< vector<float> >
而 example
是 vector<float>
。应该没有问题。那么,为什么我会遇到这个问题?
谢谢!
最可能的解释是您的数据集 "poisoned" 有一个或多个 NaN。 fdataset
或 example
数组中只需一个 NaN 即可破坏 sum
.
作为调试的辅助工具,您可以使用 std::isnan()
检查每个输入。
更新: 正如用户 akavel 在评论中建议的那样,在 IEEE 754 浮点运算中还有其他表达式也可以生成 NaN。 Wikipedia lists them here。我认为与您的代码相关的操作是:
- 其中一个操作数是 NaN 的操作
0 * inf
inf - inf
因此您还应该检查您的输入是否 inf
和 std::isinf()
。
我正在尝试实现 K-nn 分类器。这个问题的一部分是获得从一个例子到另一个例子的欧氏距离。我在计算它时遇到问题,因为 sum
最后是 NaN。
问题出在这个代码块中:
for(int i=0;i<fdataset.size();i++){
float sum=0;
for(int k=0;k<fdataset[i].size();k++){
if(mask[k]){
sum+=(fdataset[i][k]-example[k])*(fdataset[i][k]-example[k]);
}
}
results[i]=sqrt(sum);
}
fdataset
是 vector< vector<float> >
而 example
是 vector<float>
。应该没有问题。那么,为什么我会遇到这个问题?
谢谢!
最可能的解释是您的数据集 "poisoned" 有一个或多个 NaN。 fdataset
或 example
数组中只需一个 NaN 即可破坏 sum
.
作为调试的辅助工具,您可以使用 std::isnan()
检查每个输入。
更新: 正如用户 akavel 在评论中建议的那样,在 IEEE 754 浮点运算中还有其他表达式也可以生成 NaN。 Wikipedia lists them here。我认为与您的代码相关的操作是:
- 其中一个操作数是 NaN 的操作
0 * inf
inf - inf
因此您还应该检查您的输入是否 inf
和 std::isinf()
。