NaN 在C++为什么

NaN in C++ why?

本文关键字:为什么 C++ NaN      更新时间:2023-10-16

我正在尝试实现一个 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>。应该没有问题。那么,为什么我会遇到这个问题?

谢谢!

最可能的解释是你的数据集被一个或多个 NaN "毒害"。只需要fdatasetexample阵列中的一个 NaN 即可损坏sum .

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

更新:正如用户 akavel 在评论中建议的那样,还有其他表达式也可以在 IEEE 754 浮点运算中生成 NaN。维基百科在这里列出了它们。我相信与您的代码相关的操作是:

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

因此,您还应该检查您的输入是否与 std::isinf() inf