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.

20
demandé sur Dukeling 2011-06-13 05:07:25

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.

9
répondu QuantumMechanic 2011-06-13 01:22:42

(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);
} 
13
répondu Eng.Fouad 2011-06-13 02:02:48

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).

2
répondu Ignacio Vazquez-Abrams 2011-06-13 01:11:59

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.

0
répondu user3312489 2014-02-21 04:50:38
    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.

0
répondu Alexis Labat 2015-04-12 06:57:04

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

0
répondu RandomHighShooler 2016-10-27 01:17:23

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;
}
0
répondu Pavel Kataykin 2018-09-11 21:17:51

Système.hors.println (Math.pow(10, les Maths.log10(Nombre)/racine));

-2
répondu Rohit Kumar 2015-07-23 11:23:36