私はJavaでピッチ検出プログラムを作成し、forループの各繰り返しで2つの倍を比較して、サンプル配列内の最大振幅ポイントを決定します。二重比較の問題
このためのコードです:
double magnitude = 0.0;
double maxMag = 0.0;
int j = 0;
for (int i = 0; i < 2640; i += 2) {
magnitude = calcMag(sample[i], sample[i + 1])
* (i < outputLength/2 ? calcMag(sample[i * 2],
sample[i * 2 + 1]) : 1.0)
* (i < outputLength/3 ? calcMag(sample[i * 3],
sample[i * 3 + 1]) : 1.0)
* (i < outputLength/4 ? calcMag(sample[i * 4],
sample[i * 4 + 1]) : 1.0)
* (i < outputLength/5 ? calcMag(sample[i * 5],
sample[i * 5 + 1]) : 1.0);
if (magnitude > maxMag) {
maxMag = magnitude;
peakIndex = j;
}
j++;
}
デバッガを使用して、変数を見て、「大きさ」と「maxMag」の比較が正しく(maxMagがゼロである)最初の時間を動作しますが、からその上のポイントは、マグニチュードが実際にmaxMagより大きい場合でも、毎回falseに評価されます。 (大きさ> maxMag)が偽である
例と比較値:
大きさ= 2.828262485980501E20
maxMag = 1.3167436120685821E28
私は年齢のため、このを見て、潜在的なのために周りを見回してきましたダブルスの比較に関する問題(私はDoubleの無駄を比較する方法を試してみた)。だから私はここにいる誰かが私が間違っているかもしれないことにいくつかの光を当てることができるかどうか疑問に思っていますか?
おかげ
あなたの例では、マグニチュードは実際にはmaxMagより小さいです。 maxMagの最後に「magnitude」の最後に「E20」、最後に「E28」があることに注目してください。 –
あなたの値の例は、 'magnitude> maxMag'をfalseにする必要があります。マグニチュードは2.82 * 10^20で、maxMagは1.31 * 10^28です。マグニチュードが2から始まり、maxMagが1で始まるという事実に惑わされないでください。すべての数字を書き出すのではなく、科学的表記を使用しています。 –