【发布时间】:2012-03-14 03:12:10
【问题描述】:
我正在用 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++;
}
使用调试器并查看变量,“magnitude”和“maxMag”的比较第一次正常工作(当 maxMag 为零时),但从那时起,它每次都评估为 false,即使幅度为实际上大于 maxMag。
(magnitude > maxMag) 为假的比较值示例:
幅度 = 2.828262485980501E20
maxMag = 1.3167436120685821E28
我多年来一直在研究这个问题,并四处寻找比较双精度数的潜在问题(我尝试了双精度数的比较方法,但无济于事)。所以现在我想知道这里是否有人可以阐明我可能做错了什么?
谢谢
【问题讨论】:
-
在您的示例中,
magnitude实际上小于maxMag。注意magnitude末尾的“E20”和maxMag末尾的“E28”。 -
您的示例值应该将
magnitude > maxMag设为 false;幅度为 2.82*10^20,而 maxMag 为 1.31*10^28。不要被幅度以 2 开头而 maxMag 以 1 开头的事实所迷惑——它使用科学计数法,而不是写出所有数字。
标签: java comparison double