2012-02-09 3 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 равен нулю), а из эта точка на нем каждый раз оценивает значение false, даже когда величина фактически больше, чем maxMag.

Пример по сравнению значения, где (величина> maxMag) является ложным:

величина = 2.828262485980501E20

maxMag = 1.3167436120685821E28

Я смотрел на это в течение веков и огляделся потенциал проблемы с сопоставлением двойников (я пробовал методы сравнения Double to no avail). Так что теперь мне интересно, может ли кто-нибудь здесь пролить свет на то, что я могу делать неправильно?

Благодаря

+3

В вашем примере величина «величина» на самом деле меньше, чем 'maxMag'. Обратите внимание на «E20» в конце «величина» и «E28» в конце 'maxMag'. –

+2

Ваш пример значений * должен * иметь значение 'max> maxMag' false; величина 2,82 * 10^20, а maxMag - 1,31 * 10 28. Не обманывайтесь тем фактом, что величина начинается с 2, а maxMag начинается с 1 - она ​​использует научную нотацию, а не записывает все цифры. –

ответ

1

числа записываются в научной нотации здесь есть десятичное представление разбивку

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

Так

2.828262485980501E20 < 1.3167436120685821E28

вывод программы правильно.

+0

Спасибо за четкое объяснение :) – nihilo90

1

но

maxMag = 1.3167436120685821E28 

больше, чем

magnitude = 2.828262485980501E20 

Посмотрите на экспонент, после того, как "Е"!

0

magnitude не более maxMag.

magnitude находится в порядке от 10 до 20 мощности. maxMag находится в порядке от 10 до 28-й степени.

Смежные вопросы