C ++浮点数为nan

时间:2011-03-26 13:14:37

标签: c++ floating-point nan

我想知道是什么让c ++中的浮点数为nan。我使用的是大型数据集,很难追踪。我想知道将浮点数改为nan的方法,以减少bug的可能性。

我找到了导致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;}

6 个答案:

答案 0 :(得分:5)

取自wikipedia - >特殊值 - >南

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

看着你的代码:无限时间0是可能的,是吗?

编辑:

  • 0< = s< = + inf

  • 1< = m< = + inf

s / m:

  • + inf / + inf确实会产生负NaN(我测试过它)

我认为这是制造NaN的唯一因素。

答案 1 :(得分:5)

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

enter image description here

答案 2 :(得分:3)

您在评论中说,您只使用*+-

[编辑:你已经说过你也使用了pow和除法,它引入了一些获得NaN的额外方法。例如,如果参数x是一个较大的负值,则pow(e,-x)是无穷大,因此您可以轻松地最终计算无穷大/无穷大,这是另一个NaN]

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

  1. 超出范围产生正或负无穷大,
  2. 将其乘以零。
  3. 或:

    1. 产生正无穷大,
    2. 添加它们(或等效地,减去相同符号的两个无穷大)。
    3. 因此,如果您检查并捕获无穷大,您也不必担心NaN。也就是说,通常的方法是让这些值像安静的NaN一样传播,并在最后检查。

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

答案 3 :(得分:1)

答案 4 :(得分:0)

编辑尝试使用double代替float

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

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

答案 5 :(得分:0)

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

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