Подтвердить что ты не робот

Реализация n-го корня

Я работаю над тем, как вычислить корень 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 не имеет квадратного корня.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

(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);
} 

Ответ 3

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

Ответ 4

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

Ответ 5

    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;
    }   

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

Ответ 6

Я не слишком уверен в точном коде, но добавляю дополнительную инструкцию 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);
}

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

Ответ 7

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