2012-02-09 117 views
1

我正在用Java編寫基音檢測程序,並在for循環的每次迭代中比較兩個雙精度,以確定樣本數組中的最高幅度點。雙比較問題

這個代碼是:

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

我一直在看這個的年齡和四處尋找潛力比較雙打的問題(我已經嘗試了雙重比較方法無濟於事)。所以現在我想知道是否有人在這裏可以闡明我可能做錯了什麼?

感謝

+3

在你的例子中,'magnitude'實際上小於'maxMag'。注意'magnitude'結尾處的「E20」和'maxMag'結尾處的「E28」。 – 2012-02-09 22:52:05

+2

你的示例值*應該*有'magnitude> maxMag'爲false;幅度爲2.82 * 10^20,而maxMag爲1.31 * 10^28。不要被大小以2開頭,maxMag以1開頭的事實愚弄 - 它使用科學記數法,而不是寫出所有的數字。 – 2012-02-09 22:52:54

回答

1

號碼都寫在科學記數法這裏有十進制表示擊穿

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

所以

2.828262485980501E20 < 1.3167436120685821E28

程序輸出是正確的。

+0

感謝您的明確解釋:) – nihilo90 2012-02-10 14:55:38

1

maxMag = 1.3167436120685821E28 

大於

magnitude = 2.828262485980501E20 

看的指數,經過 「E」!

0

magnitude不大於maxMag

magnitude大約是10到20的次冪。 maxMag是從10到28的次冪。