Проблемы двойного сравнения - PullRequest
1 голос
/ 10 февраля 2012

Я пишу программу определения высоты тона на 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 безрезультатно). Так что теперь мне интересно, может ли кто-нибудь здесь пролить свет на то, что я могу делать неправильно?

Спасибо

Ответы [ 4 ]

1 голос
/ 10 февраля 2012

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

2.828262485980501E20 = 2.828262485980501 * 10^20 = 282826248598050100000

1.3167436120685821E28 = 1.3167436120685821 * 10^28 = 13167436120685821000000000000

Итак

2.828262485980501E20 < 1.3167436120685821E28

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

1 голос
/ 10 февраля 2012

но

maxMag = 1.3167436120685821E28

больше

magnitude = 2.828262485980501E20

Посмотрите на показатели после "E"!

0 голосов
/ 10 февраля 2012

величина = 2,28e20 НЕ больше, чем magMax = 1,31e28. Целое число после E - показатель степени. magMax на самом деле 1,31 * 10 ^ 28 (1 и 28 нулей) http://en.wikipedia.org/wiki/Scientific_notation

0 голосов
/ 10 февраля 2012

magnitude не больше, чем maxMag.

magnitude имеет порядок от 10 до 20 степени.maxMag имеет порядок от 10 до 28 степени.

...