java math nth-root

java - implementación de la raíz nth



math nth-root (8)

¿Que estás tratando de hacer? A menos que esté planeando manejar números complejos de manera completa y adecuada, no puede tomar la raíz n de un número negativo.

Por ejemplo, mientras que (-8)^(1/3) tiene una rama principal de -2 , las únicas ramas de (-4)^(1/2) son 2i y -2i .

Para manejar esto correctamente, necesita transformar el número en su forma polar y luego tomar la raíz requerida en esa forma.

Entonces -8 es el número complejo 8*exp(i*pi) . Las 1/3 raíces de eso son 2*exp(i*pi/3) , 2*exp(i*pi) , y 2*exp[i*(-pi)/3] . Luego puede usar la fórmula de Moivre para calcular las raíces en la forma a + bi .

Estoy trabajando en una forma de calcular la raíz n de un número. Sin embargo, estoy teniendo problemas con la raíz n de los números negativos.

La mayoría de la gente dice usar Math.pow(num, 1 / root) , pero esto no funciona con números negativos.

He intentado esto:

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

pero, no funciona para todos los números ya que la raíz puede ser un decimal. Por ejemplo, root(-26, 0.8) devuelve -58.71 , pero esa es una entrada no válida. Esto también dará la respuesta incorrecta para las raíces incluso. Por ejemplo, root(-2, 2) devuelve -1.41421 , pero -2 no tiene una raíz cuadrada.


No estoy muy seguro acerca del código exacto, pero agregue una declaración if extra para aclarar entre raíces impares e incluso. algo en la linea de

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

No estoy completamente seguro de si esto funcionará con su otro código, pero espero que pueda ayudar


Podría hacerlo si (num <0) {return Math.abs (Math.pow (num, 1 / root))} Luego use ''+ "i"'' cada vez que indique el valor. O use el valor absoluto para las ecuaciones y factor posterior en el positivo / negativo yi cuando sea necesario. Eso es lo que funcionó para mí.


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


Use uno de los muchos paquetes de números complejos disponibles en Internet, o convierta su número a una posición rectangular en el plano Argand, gírelo en el ángulo apropiado como lo indica la raíz y luego léalo como un par (real, imaginario) .


Yo uso el método de abajo. Tal vez no sea el más preciso, pero funciona bien en mi caso.

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


(num) ^ (1/root) es similar a exp( (1/root) * log(num) ) , así que puedes hacerlo de la siguiente manera:

public static double root(double num, double root) { return Math.pow(Math.E, Math.log(num)/root); }


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

Esto debería funcionar bien para usted, aunque no es compacto, usa la menor cantidad posible de funciones matemáticas.