90 votes

JavaScript : Calculer la nième racine d'un nombre

J'essaye d'obtenir la nième racine d'un nombre en utilisant JavaScript, mais je ne vois pas comment le faire en utilisant le module intégré Math objet. Est-ce que je néglige quelque chose ?
Si ce n'est pas le cas...

Existe-t-il une bibliothèque mathématique que je peux utiliser et qui possède cette fonctionnalité ?
Si ce n'est pas le cas...

Quel est le meilleur algorithme pour le faire moi-même ?

0 votes

Combien de racines voulez-vous ? Juste la plus évidente, ou toutes ?

0 votes

Les réponses évidentes utilisant Math.pow(x, 1/n) sont en dessous des réponses les plus élevées ici - ce que je ne comprends pas, car ces algos maison n'offrent rien de nouveau par rapport à l'utilisation de Math.pow. De plus, pour toute racine n-ième multiple de 2 ou 3, vous pouvez utiliser Math.sqrt ou Math.cbrt (qu'une réponse ci-dessous mentionne déjà), et les appeler en chaîne n fois pour obtenir toute racine 2^n ou 3^n-ième (avec n >= 1 évidemment). ou toute autre factorisation, comme la racine 6-ième serait Math.sqrt(Math.cbrt(x)) par exemple (ou l'inverse, peu importe).

168voto

Digital Plane Points 11741

Pouvez-vous utiliser quelque chose comme ça ?

Math.pow(n, 1/root);

eg.

Math.pow(25, 1/2) == 5

1 votes

Cela fonctionne si la fonction pow peut prendre un exposant fractionnaire. Ce n'est pas sûr, mais debe :)

2 votes

Il le fait mais ne gère pas les nombres négatifs

2 votes

Une petite note. La fonction pow donne une réponse approximative. Ainsi, pour les grandes valeurs, cette approximation peut renvoyer des chiffres très erronés. [[référence](http://stackoverflow.com/questions/9956471/wrong-result-by-java-math-pow) ]. Il en va de même pour l'implémentation JS. réf.

23voto

Jeremy Banks Points 32470

El n e racine de x est la même chose que x au pouvoir 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)

1 votes

Que diriez-vous de Math.pow(-32, 1/5) ?

14voto

mplungjan Points 36458

Utilisez Math.pow()

Notez qu'il ne gère pas les négatifs de manière agréable - voici une discussion et du code qui le fait

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

10voto

Somebody Points 323

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

5voto

Oriol Points 20803

El n -Racine de x est un nombre r tal que r au pouvoir de 1/n es x .

Dans les nombres réels, il y a des sous-cas :

  • Il y a deux solutions (même valeur avec un signe opposé) quand x est positif et r est égale.
  • Il existe une solution positive lorsque x est positif et r est impair.
  • Il existe une solution négative lorsque x est négatif et r est impair.
  • Il n'y a pas de solution lorsque x est négatif et r est égale.

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

0 votes

"nthRoot(-4, 2) ; // NaN (il n'y a pas de solution)" bien... au moins pas en nombres réels

0 votes

Après avoir vu stackoverflow.com/a/46268374/205696 J'ai trouvé quelques optimisations pour nthRoot . Puisque Math.pow(-4, 1/2) renvoie à NaN et puisque nous n'avons besoin que de Math.abs pour les nombres négatifs, nous pouvons utiliser Math.abs seulement pour les négatifs y les nombres impairs (je ne suis pas sûr que ce dernier point soit une optimisation). Donc, en une ligne : let nthRoot = (x, n) => n % 2 === 1 && x < 0 ? -(Math.abs(x) ** (1/n)) : x ** (1/n)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X