mise en œuvre de la nième racine
je suis en train de travailler sur un moyen de calculer le n th racine d'un nombre. Cependant, j'ai des problèmes avec le n th racine des nombres négatifs.
la Plupart des gens disent d'utiliser Math.pow(num, 1 / root)
, mais cela ne fonctionne pas pour les nombres négatifs.
j'ai essayé ceci:
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);
}
mais, cela ne fonctionne pas pour tous les nombres car la racine peut être une décimale. Par exemple,root(-26, 0.8)
retourne -58.71
, mais c'est une entrée non valide. Ce sera également l' mauvaise réponse pour des racines égales. Par exemple,root(-2, 2)
retourne -1.41421
, mais -2 n'ont pas de racine carrée.
8 réponses
Ce que vous essayez de faire? À moins que vous ne planifiez de traiter complètement et correctement les nombres complexes, vous ne pouvez pas prendre la racine nième d'un nombre négatif.
Par exemple, alors que (-8)^(1/3)
a une branche principale de -2
, les seules branches de (-4)^(1/2)
2i
et -2i
.
Pour gérer cela correctement, vous devez transformer le nombre dans sa forme polaire et puis prendre la racine requis dans ce formulaire.
-8
est le nombre complexe 8*exp(i*pi)
. 1/3
racines qui sont 2*exp(i*pi/3)
,2*exp(i*pi)
et 2*exp[i*(-pi)/3]
. Ensuite, vous pouvez utiliser de Moivre' formule pour calculer les racines de la forme a + bi
.
(num) ^ (1/root)
est similaire à exp( (1/root) * log(num) )
, de sorte que vous pouvez le faire comme ceci:
public static double root(double num, double root)
{
return Math.pow(Math.E, Math.log(num)/root);
}
utilisez L'un des nombreux paquets de nombres complexes disponibles sur Internet, ou convertissez votre nombre en une position rectangulaire sur le plan D'Argand, tournez-le à l'angle approprié comme indiqué par la racine, puis lisez-le comme une paire (réelle, imaginaire).
Vous pourriez faire si(num < 0){ de retour en Mathématiques.abs (Math.pow(num, 1 / racine)) } Ensuite, utilisez ' + " i "' chaque fois que vous indiquez la valeur. Ou utilisez la valeur absolue pour les équations et plus tard le facteur positif/négatif et i lorsque nécessaire. C'est ce qui a fonctionné pour moi.
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;
}
cela devrait fonctionner très bien pour vous, bien qu'il ne soit pas compact il utilise aussi peu de fonctions mathématiques que possible.
Je ne suis pas très sûr du code exact, mais ajoutez une instruction if supplémentaire pour clarifier entre les racines impaires et égales. quelque chose le long des lignes 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);
}
Je ne suis pas entièrement sûr que cela fonctionne avec votre autre code, mais j'espère que cela peut aider
j'utilise la méthode ci-dessous. Peut-être que ce n'est pas le plus précis, mais ça marche bien dans mon cas.
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;
}
Système.hors.println (Math.pow(10, les Maths.log10(Nombre)/racine));