双重比较问题

时间:2012-02-09 22:46:39

标签: java comparison double

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

示例比较值(幅度&gt; maxMag)为假:

幅度= 2.828262485980501E20

maxMag = 1.3167436120685821E28

我多年来一直在研究这个问题并且在比较双打时寻找潜在的问题(我尝试过Double的比较方法,但没有用)。所以现在我想知道这里是否有人可以解释我可能做错了什么?

由于

4 个答案:

答案 0 :(得分:1)

maxMag = 1.3167436120685821E28

大于

magnitude = 2.828262485980501E20

在“E”之后看看指数!

答案 1 :(得分:1)

数字是用科学记数法写的,这里有十进制表示分解

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

所以

2.828262485980501E20 < 1.3167436120685821E28

程序输出正确。

答案 2 :(得分:0)

magnitude不大于maxMag

magnitude大约是10到20的力量。 maxMag大约为10到28次幂。

答案 3 :(得分:0)

幅度= 2.28e20不大于magMax = 1.31e28。 E之后的整数是指数。 magMax实际上是1.31 * 10 ^ 28(1和28个零) http://en.wikipedia.org/wiki/Scientific_notation