2012-02-09 157 views
1

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

我一直在看这个的年龄和四处寻找潜力比较双打的问题(我已经尝试了双重比较方法无济于事)。所以现在我想知道是否有人在这里可以阐明我可能做错了什么?

感谢

+3

在你的例子中,'magnitude'实际上小于'maxMag'。注意'magnitude'结尾处的“E20”和'maxMag'结尾处的“E28”。 – 2012-02-09 22:52:05

+2

你的示例值*应该*有'magnitude> maxMag'为false;幅度为2.82 * 10^20,而maxMag为1.31 * 10^28。不要被大小以2开头,maxMag以1开头的事实愚弄 - 它使用科学记数法,而不是写出所有的数字。 – 2012-02-09 22:52:54

回答

1

号码都写在科学记数法这里有十进制表示击穿

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

所以

2.828262485980501E20 < 1.3167436120685821E28

程序输出是正确的。

+0

感谢您的明确解释:) – nihilo90 2012-02-10 14:55:38

1

maxMag = 1.3167436120685821E28 

大于

magnitude = 2.828262485980501E20 

看的指数,经过 “E”!

0

magnitude不大于maxMag

magnitude大约是10到20的次幂。 maxMag是从10到28的次幂。