【问题标题】:Causes for NaN in C++ application that do no raise a floating point exceptionC++ 应用程序中不引发浮点异常的 NaN 的原因
【发布时间】:2011-07-20 15:32:50
【问题描述】:

为了在我的 C++ 程序中找到浮点变量设置为 NaN 的原因,我启用了如下浮点异常:

#include <fenv.h>
feenableexcept(FE_INVALID | FE_OVERFLOW);

我知道它有效,因为当我写作时:

int val = 0.0/0.0;

在我的程序中出现了一个浮点异常。 但是 NaN 正在通过我的程序的浮点计算“传播”,我不知道哪个变量首先设置为 NaN。

存在什么原因导致变量 beeeing 设置为 NaN,不会导致浮点异常?

【问题讨论】:

  • 当添加 FE_UNDERFLOW 我得到很多异常,我乘以 0。下溢真的会导致 NaN 吗?
  • @Nathan 你确定你实际上没有乘以一个接近零的非常小的数字吗?
  • @Nathan:据我所知,是的。看看en.wikipedia.org/wiki/IEEE_754-2008
  • @Nathan:另一种追踪此问题的方法是创建一个 isNaN 函数并开始使用 assert(!isNaN(x)) 乱扔代码
  • @Nathan @Erik 为了明确起见,这里是 isNaN 的写法: template bool isNaN(T value) { return value != value; }

标签: c++ nan floating-point-exceptions


【解决方案1】:

如果任何输入具有安静的 NaN 值,它将导致几乎所有使用它的浮点运算的结果为 NaN不会引发无效异常

最可能的解释是某些数据是从错误的地址读取的,而读取的数据(甚至可能不是浮点数据)恰好与安静的 NaN 编码匹配。这很容易发生,因为相对常见的模式 0xffff... 编码了一个安静的 NaN。

【讨论】:

    【解决方案2】:

    你在做任何平方根运算吗?如果您尝试像 sqrt(-1) 那样计算负数的平方根,那么您将得到一个 Nan。在这种情况下,您应该得到一个“无效操作”异常。你确定你正确地捕获了所有异常吗?似乎在您的代码中某处未捕获数字异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      相关资源
      最近更新 更多