2012-10-20 55 views
1

我有這段代碼運行一個循環。小寫x變量始終打印正確。大寫X var有時正確打印,有時打印nanjunk。爲什麼?什麼導致nan錯誤結果?

N.B.數據總是相同的。

Link to FFT

Link to FFT example usage

Link to my other SO question which shows how this is being used.200點賞金!

double (*x)[2]; 
double (*X)[2]; 

x = malloc(2 * 512 * sizeof(double)); 
X = malloc(2 * 512 * sizeof(double)); 

for (j = 0; j < 10; j++){ 
    (*x)[j] = // values inserted from method argument.; 
} 

fft(512, x, X); 

for (j = 0; j < 512; j++){ 
    if (i==512*20) { 
     NSLog(@"PRE POST %f - %f",(*x)[j], (*X)[j]); 
    } 
} 
    free(x); 
    free(X); 
+0

這看起來不像C/Objective-C特定的問題。也許FFT沒有在您試圖計算的整個頻譜上定義。或者它被定義但切向爲0.0或無限。 –

回答

0

在其他語言中,我已經在工作,「南」(非數字),是當你通過0.0劃分0.0你會得到什麼。我不知道Objective-C,但它可能是相同的。

至於什麼導致nan被存儲在X ...你必須告訴我們fft的正文之前,任何人都可以回答這個問題。你說你認爲它可能是內存/指針錯誤,因爲它不一致。我只是在查看NaN如何用IEE 7754浮點格式表示(您的平臺可能使用的) - 基本上,幾個高位(通常保持浮點數的指數)都必須充滿1s。

如果確實存在內存損壞問題,導致垃圾被存儲到X中,那麼如果這些特定位全部爲1,則會導致打印數量爲「nan」。

再次,請顯示fft的正文,所以有人可以嘗試進一步幫助您。

+0

「」nan「(不是數字)是當你將一個雙倍數除以0.0時得到的結果」你正在考慮無窮大。當您將0除以0時,NaN就是您所得到的結果。 –

+0

對,謝謝......剛剛糾正了答案。 –

+0

我覺得這可能是一個記憶問題。特別是因爲它有時會起作用,有時會產生垃圾。或者我的想法不正確? –

0

在浮點運算中,有幾個操作會導致NaN錯誤。 Wikipedia指出這些操作導致的NaN:

  • 的分歧0/0和±∞/±∞

  • 的乘法0×±∞和±∞×0

  • 加料∞+(-∞),(-∞)+∞和等效減法

(這些被稱爲indeterminate forms。)

檢查您的代碼以查看您是否正在執行任何不能有數字答案的操作。

至於「垃圾」結果,它們可能是內存分配混亂的結果,但你沒有給出太多細節,所以我不能確定。

+0

我確實相信'NaN'和垃圾結果都是內存問題,因爲該方法每次都在相同的數據上運行,但會產生不同的結果。你怎麼看? –

+0

如果每次使用相同的方法都是完全相同的數據,那麼我會看到其他幾個選項。看着你的代碼,'double(* X)[2];'和'double(* x)[2];'結合malloc(2 * 512 * sizeof(double))'看起來很奇怪。它不會創建兩個512指針數組;數組(由[]'形成)是不可修改的。而當你調用'(* x)[j]'時,你正在調用例子'(* x)[510]',當你看到聲明時沒有任何意義。在這種情況下,我不會使用數組,結合動態內存,我認爲這是造成問題的原因。 – Archimaredes

+0

如果解釋有點粗糙,我很抱歉。在我研究這些之後,我可能會發佈一個完整的答案。 – Archimaredes

0

我試着運行這個 - 使用(*x)[j] = j初始化數據並刪除i==512*20打印條件。所有的價值都很好。我也嘗試過隨機輸入數據 - 仍然不錯。輸入數據的性質是什麼?

(我看你的其他問題以及)

編輯:我要指出我填補了X數組的512個值 - 你的循環以上僅填充10,那麼多輸入數組是未初始化。