【问题标题】:NaN in C++ why? [closed]C++ 中的 NaN 为什么? [关闭]
【发布时间】:2016-07-22 03:00:26
【问题描述】:

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

谢谢!

【问题讨论】:

  • "如果参数小于 -0,则引发 FE_INVALID 并返回 NaN。"来自std::sqrt
  • @Maikel sum 何时可以为负数? (fdataset[i][k]-example[k])*(fdataset[i][k]-example[k]) 总是积极的或0
  • 是 sum NaN 还是结果包含 NaN?
  • 检查fdataset是否包含NaNexample是否包含NaN
  • 为了清楚起见,除了“某处输入错误”之外,您极不可能因为任何其他原因获得 NaN。由于代码和数据不完整,这里的任何人都无法说出某个地方是什么——但我想说,你不太可能发现编译器或硬件错误。

标签: c++ classification nan knn


【解决方案1】:

最可能的解释是您的数据集被一个或多个 NaN“毒化”。只需 fdatasetexample 数组中的单个 NaN 即可破坏 sum

为了帮助调试,您可以使用std::isnan() 检查每个输入。

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

  • 操作数之一为 NaN 的操作
  • 0 * inf
  • inf - inf

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

【讨论】:

  • 另外,如果某些值溢出浮动,它们显然可以become INF,我认为 INF-INF 是 NaN
猜你喜欢
  • 2018-05-30
  • 2020-08-03
  • 2023-01-31
  • 2013-04-23
  • 2017-02-16
  • 1970-01-01
  • 2021-06-18
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多