Will Will - 1 month ago 9
Java Question

nth root implementation

I am working on a way to calculate the nth root of a number. However, I am having problems with the nth root of negative numbers.

Most people say to use

Math.pow(num, 1 / root)
, but this does not work for negative numbers.

I have tried this:

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


but, it does not work for all numbers as the root can be a decimal. For example
root(-26, 0.8)
returns
-58.71
, but that is an invalid input. This will also give the wrong answer for even roots. For example
root(-2, 2)
returns
-1.41421
, but -2 does not have a square root.

Answer

What are you trying to do? Unless you're planning to fully and properly handle complex numbers you cannot take the nth root of a negative number.

For example, while (-8)^(1/3) has a principal branch of -2, the only branches of (-4)^(1/2) are 2i and -2i.

To handle this properly you need to transform the number into its polar form and then take the required root in that form.

So -8 is the complex number 8*exp(i*pi). The 1/3 roots of that are 2*exp(i*pi/3), 2*exp(i*pi), and 2*exp[i*(-pi)/3]. Then you can use de Moivre' formula to compute the roots in the form a + bi.