【问题标题】:Double comparison problems双重比较问题
【发布时间】: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 &gt; maxMag 设为 false;幅度为 2.82*10^20,而 maxMag 为 1.31*10^28。不要被幅度以 2 开头而 maxMag 以 1 开头的事实所迷惑——它使用科学计数法,而不是写出所有数字。

标签: java comparison double


【解决方案1】:

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

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

所以

2.828262485980501E20 &lt; 1.3167436120685821E28

程序输出正确。

【讨论】:

    【解决方案2】:

    但是

    maxMag = 1.3167436120685821E28
    

    大于

    magnitude = 2.828262485980501E20
    

    看看“E”之后的指数!

    【讨论】:

      【解决方案3】:

      magnitude 不大于maxMag

      magnitude 是 10 的 20 次方。 maxMag 是 10 的 28 次方。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-09
          • 2011-08-02
          • 2019-01-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-08
          相关资源
          最近更新 更多