2012-02-24 64 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