2012-02-09 22 views
1

私は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の無駄を比較する方法を試してみた)。だから私はここにいる誰かが私が間違っているかもしれないことにいくつかの光を当てることができるかどうか疑問に思っていますか?

おかげ

+3

あなたの例では、マグニチュードは実際にはmaxMagより小さいです。 maxMagの最後に「magnitude」の最後に「E20」、最後に「E28」があることに注目してください。 –

+2

あなたの値の例は、 'magnitude> maxMag'をfalseにする必要があります。マグニチュードは2.82 * 10^20で、maxMagは1.31 * 10^28です。マグニチュードが2から始まり、maxMagが1で始まるという事実に惑わされないでください。すべての数字を書き出すのではなく、科学的表記を使用しています。 –

答えて

1

番号がここに科学表記法で書かれているプログラムの出力が正しいので

2.828262485980501E20 < 1.3167436120685821E28

が10進表現の内訳

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

です。

+0

明確な説明をありがとう:) – nihilo90

1

しかし

maxMag = 1.3167436120685821E28 

は、 "E" の後、指数で

magnitude = 2.828262485980501E20 

ルックよりも大きくなっています!

0

magnitudeは、maxMag以下である。

magnitudeは、10乗の20乗である。 maxMagは、10乗28乗の順です。