2016-04-13 11 views
2

Я пытаюсь сделать метод, который находит приближение естественного логарифма переменной с использованием серии Тейлора.Как закодировать журналы/Обработка с помощью NaN

Я знаю метод Math.log(a) и не хочу его использовать здесь.

Проблема в том, что для чисел, больших 2, возвращается результат NaN. Это верно, только если внешний цикл for установлен для выполнения большого количества раз. Например, n < 10 дает результат, но не точно. Тем не менее, чем больше проходит внешний цикл for, тем точнее будет результат.

Ряды Тейлора для поиска ln(x) (по сути то, что я пытаюсь написать в Java коде) Taylor Series for finding <code>ln(x)</code>

public static double nat_log(double x) { 
    double result = 0.0; 
    for (int n = 1; n < 10000; n++) { 
    double a = x - 1; 
    int b = 1; 
    for (int j = 1; j < n; j++) { 
     a *= (x - 1); 
     b *= -1; 
    } 
    result += b * a/n; 
    } 
    return result; 
    } 

Моя логика такова, что в какой-то момент a становится слишком большим и получает читать как NaN, таким образом, отбрасывая остальную часть кода. Поэтому я попробовал версию с использованием цикла while и метода Double.isNaN(double), чтобы проверить, действительно ли a стал NaN. Результатом стал бесконечный цикл.

public static double nat_log(double x) { 
    double result = 0.0; 
    double a = x - 1; 
    int count = 1; 
    while (Double.isNaN(a) == false) { 
    a = x - 1; 
    int b = -1; 
    for (int j = 0; j < count; j++) { 
     a *= (x - 1); 
     b *= -1; 
    } 
    result += b * (a/count); 
    count++; 
    } 
} 

В этот момент я действительно застрял и не знаю точно, где проблема, может быть, я просто пытаюсь сделать что-то без соответствующих инструментов.

+0

Я не ясно ли уже знал, что ты это или нет, но этот ряд Тейлора не сходится, если х> 2. См https: // эн. wikipedia.org/wiki/Taylor_series#List_of_Maclaurin_series_of_some_common_functions – ajb

+2

Кроме того, я не думаю, что вы действительно получаете «NaN». Если вы продолжаете умножать числа, и они становятся слишком большими, в конечном итоге вы получите «бесконечность», которая отличается от «NaN». Это объясняет бесконечный цикл. Возможно, вы захотите изменить свой второй алгоритм, чтобы проверить 'Double.isInfinite()', чтобы проверить это для себя. – ajb

+1

Если вам действительно нужен алгоритм, который работает для x> 2, я думаю, ваш лучший выбор - разделить его на _e_ несколько раз, пока он не станет <2, и подсчитайте количество раз, когда вы разделите. Если счетчик равен «N», добавьте «N» к результату серии Тейлора. – ajb

ответ

-1

Ваш цикл в то время как становится infinate цикл, когда счетчик переполняется

+0

'while' вообще не смотрит на' count', поэтому этот ответ не имеет смысла. – ajb

+0

@ajb Да, я знаю, но это может сделать никогда не NAN –

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

  • Нет связанных вопросов^_^