реализация корня nth - PullRequest
       12

реализация корня nth

20 голосов
/ 13 июня 2011

Я работаю над тем, как вычислить корень числа n th .Однако у меня проблемы с корнем n th отрицательных чисел.

Большинство людей говорят, что используют Math.pow(num, 1 / root), но это не работает для отрицательных чисел.

Я пробовал это:

public static double root(double num, double root) {
    if (num < 0) {
        return -Math.pow(Math.abs(num), (1 / root));
    }
    return Math.pow(num, 1.0 / root);
}

, но это не работает для всех чисел, поскольку корень может быть десятичным.Например, root(-26, 0.8) возвращает -58.71, но это неверный ввод.Это также даст неправильный ответ для четных корней.Например, root(-2, 2) возвращает -1.41421, но -2 не имеет квадратного корня.

Ответы [ 8 ]

15 голосов
/ 13 июня 2011

(num) ^ (1/root) похож на exp( (1/root) * log(num) ), поэтому вы можете сделать это следующим образом:

public static double root(double num, double root)
{
    return Math.pow(Math.E, Math.log(num)/root);
} 
9 голосов
/ 13 июня 2011

Что вы пытаетесь сделать? Если вы не планируете полностью и правильно обрабатывать комплексные числа, вы не сможете получить n-ный корень отрицательного числа.

Например, хотя (-8)^(1/3) имеет главную ветвь -2, единственными ветвями (-4)^(1/2) являются 2i и -2i.

Для правильной обработки вам необходимо преобразовать число в его полярную форму, а затем получить требуемый корень в этой форме.

Итак, -8 - комплексное число 8*exp(i*pi). Корни этого 1/3 это 2*exp(i*pi/3), 2*exp(i*pi) и 2*exp[i*(-pi)/3]. Затем вы можете использовать формула де Моивра для вычисления корней в виде a + bi.

2 голосов
/ 13 июня 2011

Либо используйте один из множества пакетов комплексных чисел, доступных в Интернете, либо преобразуйте ваш номер в прямоугольную позицию на плоскости Аргана, поверните его на соответствующий угол, заданный корнем, затем прочитайте его какмнимая пара).

1 голос
/ 12 сентября 2018

Я использую метод ниже.Может быть, это не самый точный, но в моем случае это хорошо работает.

public double root(double num, double root) {
    double d = Math.pow(num, 1.0 / root);
    long rounded = Math.round(d);
    return Math.abs(rounded - d) < 0.00000000000001 ? rounded : d;
}
0 голосов
/ 27 октября 2016

Я не слишком уверен в точном коде, но добавлю дополнительный оператор if для прояснения четных и нечетных корней. что-то вроде

public static double root(double num, double root) {
    if (num < 0) {
        if(root%2==1) {
            return -Math.pow(Math.abs(num), (1 / root));
        }
    }
    return Math.pow(num, 1.0 / root);
}

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

0 голосов
/ 23 июля 2015

System.out.println (Math.pow (10, Math.log10 (Number) / root));

0 голосов
/ 12 апреля 2015
    public double root(double num, double root) {
        double y=1;
        double x;
        while(Math.pow(x, root) != num) {
            if(Math.pow(x, root) > num) {
                x=x-y;
                y=y/10;
            } else {
                x=x+y;
            }
        }
        return x;
    }   

Это должно хорошо работать для вас, хотя оно не компактно, а использует как можно меньше математических функций

0 голосов
/ 21 февраля 2014

Вы можете сделать, если (num <0) {return Math.abs (Math.pow (num, 1 / root))} Тогда просто используйте '+ "i"' всякий раз, когда указывается значение.Или используйте абсолютное значение для уравнений, а затем добавьте положительное / отрицательное значение и, при необходимости, значение i.Вот что сработало для меня. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...