【问题标题】:Debug C++ code: Catch first NaN appearance [duplicate]调试 C++ 代码:捕获第一个 NaN 外观 [重复]
【发布时间】:2012-08-09 15:49:55
【问题描述】:

是否有一种简单的方法可以在调试器中检查 C++ 代码中首次出现的 NaN 值?

【问题讨论】:

  • 第一次出现在什么方面?在数组、向量、算法或其他东西中?
  • 为了明确我的问题:在我庞大而复杂的代码中,生成了一个包含一些 NaN 的矩阵。我的问题是追溯第一个 NaN 的创建位置。
  • 你能指定如何填充矩阵吗?如果它被动态填充,那么您可以将表示单个数字的矩阵成员的数据类型更改为某个类。然后你重载它的operator = (float f)。在重载中,您将断言放入 NaN。这行得通吗?
  • 好的:已经有讨论了:stackoverflow.com/q/5393997/1326595

标签: c++ debugging nan


【解决方案1】:

您可以输入 assert(val >= 0 || val <= 0) 来捕获 NaN

【讨论】:

  • 更简单的可能是assert(val == val)
  • 我猜 Andrew 的解决方案更适合优化器
【解决方案2】:

根据 IEEE 标准,false 的以下条件是 NaN 的:

val == val

您可以使用它来触发断言或软件断点,但要注意编译器优化。可能在调试版本中它不会得到优化

【讨论】:

  • 如果标准规定 val == val 对于 NaN 应该为假,那么它应该被优化。此处的优化将是编译器中的错误。
  • @DanielDaranas 是的,你一定读过同一个帖子。众说纷纭。有人建议声明val volatile 以增加安全感。我只是找不到它..
  • 我知道如何检查一个值是否为 NaN。但我的问题是,如何检查第一个 NaN 的创建位置。问题是我的最终矩阵有一些 NaN,现在我必须追溯它的来源。
【解决方案3】:

这里给出答案:https://stackoverflow.com/a/5394095/1326595

只包含

#include <fenv.h>

然后在代码中添加以下行:

feenableexcept(FE_INVALID | FE_OVERFLOW);

调试器能够捕获信号并显示第一次出现的 NaN。

【讨论】:

  • 根据您的环境,您可能需要在 include 上方添加 #define _GNU_SOURCE
猜你喜欢
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多