2011-09-05 22 views
52

Sto cercando di ottenere l'ennesima radice di un numero utilizzando JavaScript, ma non vedo un modo per farlo utilizzando l'oggetto incorporato Math. Sto trascurando qualcosa?
Se non ...JavaScript: Calcola l'ennesima radice di un numero

C'è una libreria matematica che posso usare che ha questa funzionalità?
Se non ...

Qual è il miglior algoritmo per farlo da solo?

+0

Quante radici vuoi? Solo il singolo più ovvio, o tutti loro? –

risposta

92

Puoi usare qualcosa del genere?

Math.pow(n, 1/root); 

es.

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

Funzionerà se la funzione Pow può assumere un esponente frazionario. Non sono sicuro, ma è _should_ :) –

+0

ma non gestisce i numeri negativi – mplungjan

+1

Una piccola nota. La funzione di pow si avvicina alla risposta. Quindi, per valori grandi, questa approssimazione può restituire numeri molto sbagliati. [[Riferimento] (http://stackoverflow.com/questions/9956471/wrong-result-by-java-math-pow)]. Lo stesso vale per l'implementazione JS. [ref] (http://www.ecma-international.org/ecma-262/6.0/#sec-math.pow) –

16

La radice n di x è la stessa di alla potenza di 1/n. Puoi semplicemente usare Math.pow:

var original = 1000; 
var fourthRoot = Math.pow(original, 1/4); 
original == Math.pow(fourthRoot, 4); // (ignoring floating-point error) 
9

Usa Math.pow()

Nota che non gestisce bene negativo - qui è una discussione e un po 'di codice che fa

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

The n - la radice di x è un numero r tale che r alla potenza di 1/n è x.

In numeri reali, ci sono alcuni sottocasi:

  • Ci sono due soluzioni (stesso valore con segno opposto) quando x è positivo e r è ancora.
  • C'è una soluzione positiva quando x è positivo e r è dispari.
  • C'è una soluzione negativa quando x è negativo e r è dispari.
  • Non c'è soluzione quando x è negativo e r è pari.

Dal Math.pow non piace una base negativa con un esponente non intero, è possibile utilizzare

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

Esempi:

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

"nthRoot (-4, 2); // NaN (non c'è soluzione) " beh ... almeno non in numeri reali – Moritz

2

Si potrebbe utilizzare

Math.nthroot = function(x,n) { 
    //if x is negative function returns NaN 
    return this.exp((1/n)*this.log(x)); 
} 
//call using Math.nthroot(); 
2

Per i casi speciali di radice quadrata e cubica, è meglio utilizzare le funzioni native Math.sqrt e Math.cbrt rispettivamente.

Al ES7, il exponentiation operator ** può essere utilizzato per calcolare il n esima radice della /n esima potenza di una base non negativo:

let root1 = Math.PI ** (1/3); // cube root of π 

let root2 = 81 ** 0.25;   // 4th root of 81 

Questo doesn Lavorare con basi negative, però.

let root3 = (-32) ** 5;   // NaN 
Problemi correlati