2012-02-24 66 views
2

我不知道为什么下面的代码不工作,我试图找到数组中的NaN值,然后将NaN移动到数组中的第一个元素(元素0)和交换现有元素0与NaN在哪里。请你可以检查我的代码吗?也许你们/女孩可以看到我不能做的事情?在数组中的移动元素

在此先感谢!

#define NaN (float)(1e308*10*0) 


void movenan(float array[], int size) 
{ 
int w; 
float hold; 
float move; 

for(w = 0; w < SIZE - 1; w++) 
{ 
    if(array[w] == NaN) 
    { 
     hold = array[w]; 
     array[w] = array[0]; 
     array[0] = hold; 
    } 
} 

}

+0

我想你不能测试楠这样。看到这篇文章:http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in-c – dbrank0 2012-02-24 08:41:14

+0

此外循环是为(W = 0; W Avi 2012-02-24 08:43:15

+0

我假设你想循环数组,直到'w 2012-02-24 08:49:20

回答

6

NaN检查是错误的:NaN的不比较等于任何东西,包括自己。

使用isnan()检查值是否为NaN。

如果isnan()不可用,检查f是否为NaN的规范方法如下:f != f。如果f是NaN,则该评估为真。

这里有很多的更多信息:Checking if a double (or float) is NaN in C++(问题是关于C++,但有大量的关于C的信息也是如此。)

最后,您for循环的终止条件看起来嫌疑。你的意思是< SIZE<= SIZE-1

+0

谢谢! – John 2012-02-24 08:52:28

0

如果你试图解析整个数组,那么条件应该是 是w<size否则它只解析到第二个最后一个元素。

+0

由于某种原因,我不能在这里看到我的整个文本。你的循环条件应该是 codious 2012-02-24 08:45:51

+1

'<'字符开始一些HTML格式。您需要使用代码标记(请参阅编辑)。单击编辑器按钮栏右侧的'?'按钮以获取有关标记的更多信息。 – Gilles 2012-02-24 10:09:04

2

我怀疑问题是你的南比较。 NaNs不是那么一致。

您应该使用isnan()函数或其中一个变体。如果你不想因为某些愚蠢的原因而使用isnan,检查nan的最简单方法是if(array[w] != array[w])。有了真正的NAN,这应该可行,假设你的优化器没有把它解决。

您在这个循环是也关闭一(应该是w < sizeSIZE可能是别的东西,你不想去,直到size-1

+1

如果优化器消除了浮点数上的'!=',那么您确实需要更好的编译器。 – 2012-02-24 08:51:56