Я пишу программу определения высоты тона на 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.
Пример сравниваемых значений, где (величина> maxMag) ложно:
величина = 2,828262485980501E20
maxMag = 1.3167436120685821E28
Я искал это целую вечность и искал потенциальные проблемы со сравнением двойных чисел (я пробовал сравнивать методы Double безрезультатно). Так что теперь мне интересно, может ли кто-нибудь здесь пролить свет на то, что я могу делать неправильно?
Спасибо