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);
}

fdatasetvector< vector<float> >examplevector<float>。应该没有问题。那么,为什么我会遇到这个问题?

谢谢!

最可能的解释是您的数据集 "poisoned" 有一个或多个 NaN。 fdatasetexample 数组中只需一个 NaN 即可破坏 sum.

作为调试的辅助工具,您可以使用 std::isnan() 检查每个输入。

更新: 正如用户 akavel 在评论中建议的那样,在 IEEE 754 浮点运算中还有其他表达式也可以生成 NaN。 Wikipedia lists them here。我认为与您的代码相关的操作是:

  • 其中一个操作数是 NaN 的操作
  • 0 * inf
  • inf - inf

因此您还应该检查您的输入是否 infstd::isinf()