Вычислить логарифм - PullRequest
       23

Вычислить логарифм

3 голосов
/ 15 апреля 2011

Я пытаюсь написать метод, который принимает базу k и значение n до 2 десятичных знаков, а затем вычисляет базу логарифмов k из n без использования какой-либо изМетоды Java Math.log.Вот что у меня получилось:

public static double log(double k, double n) {
    double value = 0.0;

    for(double i = 1; i > .001; i /= 10) {
        while(!(Math.pow(k, value) >= n )) {
            value += i;
        }
    }

    return value;
}

Проблема возникает, когда я пытаюсь вычислить базу журнала 4 из 5.0625, которая возвращает 2.0, но должна вернуть 1.5.

Понятия не имею почемуэто не работаетЛюбая помощь приветствуется.

Нет, это не домашняя работа, это часть проблемы, которую я пытаюсь решить для удовольствия.

Ответы [ 5 ]

5 голосов
/ 15 апреля 2011

Вы добавляете сумму i один раз слишком часто. Таким образом, вы очень скоро достигнете значения, превышающего фактическое значение, и цикл while больше никогда не будет введен.

Вычтите i один раз из значения, и все будет в порядке:

for(double i = 1; i > .001; i /= 10) {
    while(!(Math.pow(k, value) > n )) {
        value += i;
    }
    value -= i;
}
4 голосов
/ 15 апреля 2011

Шаг через код на бумаге:

Iteration: i=1 value = 0.0, calculated power = 1
Iteration: i=1 value = 1.0, calculated power = 4
Iteration: i=1 value = 2.0, calculated power = 16

Теперь на данный момент ваше значение равно 2,0. Но ни в одной точке кода вам не удастся исправить в обратном направлении. Вам необходимо проверить как случаи превышения, так и превышения.

1 голос
/ 15 апреля 2011

Расчет бревен вручную, какое удовольствие! Я предлагаю сделать это на бумаге, затем пройтись по коду с помощью переменных наблюдения или вывести каждую переменную на каждом шаге. Затем проверьте этот метод и посмотрите, соответствует ли он тому, что вы делаете: http://mathforum.org/library/drmath/view/55566.html

1 голос
/ 15 апреля 2011

Эта петля

    while(!(Math.pow(k, value) >= n )) {
        value += i;
    }

заходит слишком далеко. Он останавливается только после превышения правильного значения. Таким образом, при расчете одного места 1 недостаточно, поэтому он переходит к 2,0, и все последующие тесты показывают, что его по крайней мере достаточно, и на этом все заканчивается.

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

Вы всегда можете посмотреть на:

https://stackoverflow.com/a/2073928/251767

Он предоставляет алгоритм, который будет вычислять журнал любого числа в любой базе.Это ответ на вопрос о вычислении журналов с типами BigDecimal, но его можно довольно легко адаптировать к любому типу с плавающей запятой.

Поскольку он использует возведение в квадрат и деление на два, вместо использования несколькихвызовы Math.pow(), должны сходиться довольно быстро и использовать меньше ресурсов процессора.

...