我正在用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