Реализация 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 не имеет квадратного корня.
Ответы
Ответ 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));