我正在用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
我一直在看這個的年齡和四處尋找潛力比較雙打的問題(我已經嘗試了雙重比較方法無濟於事)。所以現在我想知道是否有人在這裏可以闡明我可能做錯了什麼?
感謝
在你的例子中,'magnitude'實際上小於'maxMag'。注意'magnitude'結尾處的「E20」和'maxMag'結尾處的「E28」。 – 2012-02-09 22:52:05
你的示例值*應該*有'magnitude> maxMag'爲false;幅度爲2.82 * 10^20,而maxMag爲1.31 * 10^28。不要被大小以2開頭,maxMag以1開頭的事實愚弄 - 它使用科學記數法,而不是寫出所有的數字。 – 2012-02-09 22:52:54