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.