J'essaie d'obtenir la nième racine d'un nombre en utilisant JavaScript, mais je ne vois pas de moyen de le faire en utilisant l'objet Math
intégré. Suis-je en train d'oublier quelque chose?
Si non...
Y a-t-il une bibliothèque mathématique que je peux utiliser qui a cette fonctionnalité?
Si non...
Quel est le meilleur algorithme pour le faire moi-même?
Pouvez-vous utiliser quelque chose comme ça?
Math.pow(n, 1/root);
par exemple.
Math.pow(25, 1/2) == 5
La racine de n
th de x
est la même que x
à la puissance de 1/n
. Vous pouvez simplement utiliser Math.pow
:
var original = 1000;
var fourthRoot = Math.pow(original, 1/4);
original == Math.pow(fourthRoot, 4); // (ignoring floating-point error)
Utilisez Math.pow ()
Notez qu'il ne gère pas bien les négatifs - voici une discussion et du code qui ne
http://cwestblog.com/2011/05/06/cube-root-an-beyond/
function nthroot(x, n) {
try {
var negate = n % 2 == 1 && x < 0;
if(negate)
x = -x;
var possible = Math.pow(x, 1 / n);
n = Math.pow(possible, n);
if(Math.abs(x - n) < 1 && (x > 0 == n > 0))
return negate ? -possible : possible;
} catch(e){}
}
Vous pourriez utiliser
Math.nthroot = function(x,n) {
//if x is negative function returns NaN
return this.exp((1/n)*this.log(x));
}
//call using Math.nthroot();
n
- e racine de x
est un nombre r
tel que r
à la puissance de 1/n
est x
.
En nombre réel, il existe quelques sous-cas:
x
est positif et r
est pair.x
est positif et r
est impair.x
est négatif et r
est impair.x
est négatif et r
est pair.Puisque Math.pow
n'aime pas une base négative avec un exposant non entier, vous pouvez utiliser
function nthRoot(x, n) {
if(x < 0 && n%2 != 1) return NaN; // Not well defined
return (x < 0 ? -1 : 1) * Math.pow(Math.abs(x), 1/n);
}
Exemples:
nthRoot(+4, 2); // 2 (the positive is chosen, but -2 is a solution too)
nthRoot(+8, 3); // 2 (this is the only solution)
nthRoot(-8, 3); // -2 (this is the only solution)
nthRoot(-4, 2); // NaN (there is no solution)
Pour les cas particuliers de racine carrée et cubique, il est préférable d'utiliser les fonctions natives Math.sqrt
et Math.cbrt
respectivement.
Depuis ES7, le opérateur d'exponentiation **
peut être utilisé pour calculer la racine n e comme 1/ n e puissance d'une base non négative:
let root1 = Math.PI ** (1 / 3); // cube root of π
let root2 = 81 ** 0.25; // 4th root of 81
Cependant, cela ne fonctionne pas avec des bases négatives.
let root3 = (-32) ** 5; // NaN
Voici une fonction qui essaie de renvoyer le nombre imaginaire. Il vérifie également d'abord quelques éléments communs, par exemple: si vous obtenez la racine carrée de 0 ou 1, ou si vous obtenez la racine 0 du nombre x
function root(x, n){
if(x == 1){
return 1;
}else if(x == 0 && n > 0){
return 0;
}else if(x == 0 && n < 0){
return Infinity;
}else if(n == 1){
return x;
}else if(n == 0 && x > 1){
return Infinity;
}else if(n == 0 && x == 1){
return 1;
}else if(n == 0 && x < 1 && x > -1){
return 0;
}else if(n == 0){
return NaN;
}
var result = false;
var num = x;
var neg = false;
if(num < 0){
//not using Math.abs because I need the function to remember if the number was positive or negative
num = num*-1;
neg = true;
}
if(n == 2){
//better to use square root if we can
result = Math.sqrt(num);
}else if(n == 3){
//better to use cube root if we can
result = Math.cbrt(num);
}else if(n > 3){
//the method Digital Plane suggested
result = Math.pow(num, 1/n);
}else if(n < 0){
//the method Digital Plane suggested
result = Math.pow(num, 1/n);
}
if(neg && n == 2){
//if square root, you can just add the imaginary number "i=√-1" to a string answer
//you should check if the functions return value contains i, before continuing any calculations
result += 'i';
}else if(neg && n % 2 !== 0 && n > 0){
//if the nth root is an odd number, you don't get an imaginary number
//neg*neg=pos, but neg*neg*neg=neg
//so you can simply make an odd nth root of a negative number, a negative number
result = result*-1;
}else if(neg){
//if the nth root is an even number that is not 2, things get more complex
//if someone wants to calculate this further, they can
//i'm just going to stop at *n√-1 (times the nth root of -1)
//you should also check if the functions return value contains * or √, before continuing any calculations
result += '*'+n+√+'-1';
}
return result;
}