【问题标题】:C++ float number to nanC ++浮点数到nan
【发布时间】:2011-07-23 11:41:30
【问题描述】:

我想知道是什么使 c++ 中的浮点数 nan。我正在使用一个大型数据集,而且很难追踪。我想知道将浮点数更改为 nan 以减少错误可能性的方法。

我找到了导致 nan 问题的代码。我发现在某些情况下 s/m 是 nan。但是不知道怎么解决。

float gp(float x){
float e = 2.71828183;
x *= -1;
float s = pow(e,x);
float m = (1 + pow(e,x)) * (1 + pow(e,x));  
return s / m;}

【问题讨论】:

  • 您的代码中是否有任何未经检查的强制转换?我几乎可以肯定,如果您只在定义明确(= 正确初始化的非 NaN)值上使用 +、– 和 *,您将无法获得 NaN。
  • 我在这里发布了一些代码。你认为这会造成问题吗?
  • 无限乘以零(如我的回答中所述)是可能的
  • 我编辑了这个问题。你能看一下吗?

标签: c++ floating-point nan


【解决方案1】:

【讨论】:

  • 您可以使用函数isnan()检查float何时变为NaN并在此处发布操作。
【解决方案2】:

编辑尝试使用double 而不是float

可能取决于您使用的编译器,但一般选项是:

  • 变量太小了
  • 变量太大
  • 除以 0(零)

【讨论】:

  • 变量太大了不会溢出吗!?
  • 我使用浮点数作为变量。我可以使用更大的花车吗?像双浮动!?
  • “太大”或“太小”应该导致无穷大或零,而不是 NaN
【解决方案3】:

取自wikipedia -> 特殊值 -> nan

  • 0/0
  • ∞×0
  • sqrt(-1)
  • 一般“无效操作”(我不确定是否不超过上述三个)

看看你的代码:无穷乘以 0 是可能的,是吗?

编辑:

  • 0

  • 1

秒/米:

  • +inf / +inf 确实会减去 NaN(我测试过)

我认为这是产生 NaN 的唯一因素。

【讨论】:

  • 顺便说一句,如果您使用 s 而不是计算相同的幂 3 次,该函数可能会更有效。
  • 我认为,如果你将一个有限的数字减去零,你也会得到一个 NaN(不仅仅是 0/0)
【解决方案4】:

你在评论中说你只使用*+-

[编辑:你已经说过你还使用pow 和除法,这引入了一些额外的方法来获得 NaN。例如,如果参数x 是一个很大的负值,那么pow(e,-x) 就是无穷大,所以你可以很容易地计算无穷大/无穷大,这是另一个NaN]

所以,如果你有 IEEE 浮点,那么假设 summary 是正确的,你可以生成 NaN 的唯一方法是:

  1. 通过超出范围生成正无穷或负无穷,
  2. 乘以零。

或:

  1. 生成正无穷和负无穷,
  2. 将它们相加(或等效地,减去两个相同符号的无穷大)。

因此,如果您检查并捕获无穷大,您也不必担心 NaN。也就是说,通常的方法是让这些值作为安静的 NaN 传播,并在最后检查。

对于使用非 IEEE 算术的 C++ 实现,我不确定允许使用 NaN 时的规则是什么。我可以在标准中查找它们,但是你也可以;-)

【讨论】:

    【解决方案5】:

    这正是enabling and trapping floating-point exceptions 的用例。这样您就可以准确检测到 NaN(或其他异常值)首次出现的位置。

    但是,这是一个依赖于平台的功能,因此您可能需要查看编译器和/或硬件的文档。

    【讨论】:

      【解决方案6】:

      如果您可以将 x 保持在 0 和 FLT_MAX 之间(在我的情况下为 3.40E+38),您的 gp 函数将不会返回 NaN。

      【讨论】:

        猜你喜欢
        • 2012-03-09
        • 2020-11-11
        • 2013-05-05
        • 2011-11-04
        • 2011-03-29
        • 2011-05-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-10
        相关资源
        最近更新 更多