1

ループを実行するこのコードのチャンクがあります。小文字のxvar は常に正しく出力されます。大文字のXvarは、正しく出力される場合もあれば、nanorが出力される場合もありますjunk。なんで?

注意: データは常に同一です。

FFTへのリンク

FFT の使用例へのリンク

これがどのように使用されているかを示す私の他のSOの質問へのリンク。 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);
4

3 に答える 3

1

浮動小数点演算では、NaN エラーになる演算がいくつかあります。ウィキペディアは、これらの操作が NaN になると指摘しています。

  • 除算 0/0 および ±∞/±∞</p>

  • 乗算 0×±∞ および ±∞×0

  • 足し算 ∞ + (−∞)、(−∞) + ∞ および同等の引き算

(これらは不定形と呼ばれます。)

コードをチェックして、数値の答えを持たない操作を実行していないかどうかを確認してください。

「がらくた」の結果については、メモリ割り当ての混乱の結果である可能性がありますが、詳細を提供していないため、確信が持てません。

于 2012-10-20T14:12:45.610 に答える
0

これを実行してみました - を使用してデータを初期化し、印刷条件(*x)[j] = jを削除しました。i==512*20すべての値が正常に戻りました。また、ランダムな入力データを試してみましたが、それでも問題ありません。入力データの性質は何ですか?

(あなたの他の質問も見てみます)

編集: x 配列の 512 個の値を入力したことを指摘しておく必要があります。上記のループは 10 個しか入力しないため、入力配列の多くは初期化されていません。

于 2012-10-23T05:29:47.803 に答える
0

0.0私が取り組んだ他の言語では、「NaN」(数字ではない) は、 a をで割ったときに得られるものです0.0。Objective-C はわかりませんが、おそらく同じです。

何がnan保存されているのかについては...誰かがそれに答える前にX、あなたは私たちに体を見せる必要があります. fft一貫性がないため、メモリ/ポインターのバグである可能性があると思います。NaN が IEE 7754 浮動小数点形式 (プラットフォームで使用されている可能性が高い) でどのように表現されるかを調べました。基本的に、いくつかの上位ビット (通常は浮動小数点数の指数を保持します) 1で埋めます。

ジャンクが に保存される原因となるメモリ破損バグがあるX場合、これらの特定のビットがたまたますべて 1 であった場合、数値が「nan」として出力されます。

繰り返しになりますが、 の本文を見せてくださいfft。誰かがあなたをさらに助けてくれます。

于 2012-10-20T14:07:39.223 に答える