2011-09-05 9 views
52

Próbuję uzyskać n-ty numer roota za pomocą JavaScript, ale nie widzę sposobu, aby to zrobić za pomocą wbudowanego obiektu Math. Czy coś przeoczyłem?
Jeśli nie ...JavaScript: Oblicz n-ty root numeru

Czy istnieje biblioteka matematyki, z której mogę korzystać, która ma tę funkcjonalność?
Jeśli nie ...

Jaki jest najlepszy algorytm do wykonania tego samodzielnie?

+0

Ile z tych korzeni chcesz? Tylko ten najbardziej oczywisty, czy wszystkie? –

Odpowiedz

92

Czy możesz użyć czegoś takiego?

Math.pow(n, 1/root); 

np.

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

To zadziała, jeśli funkcja pow może przyjąć wykładnik cząstkowy. Nie jestem pewien, ale to _może_ :) –

+0

ma, ale nie obsługuje liczb ujemnych – mplungjan

+1

Mała nuta. Funkcja pow przybliżona odpowiedź. Tak więc dla dużych wartości to przybliżenie może zwrócić bardzo złe liczby. [[odniesienie] (http://stackoverflow.com/questions/9956471/wrong-result-by-java-math-pow)]. To samo dotyczy implementacji JS. [ref] (http://www.ecma-international.org/ecma-262/6.0/#sec-math.pow) –

16

Korzeń n th z x jest taki sam jak x do potęgi 1/n. Możesz po prostu użyć: Math.pow:

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

Zastosowanie Math.pow()

Zauważ, że nie zajmuje się ujemna ładnie - tutaj jest dyskusja i jakiś kod, który robi

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 - th root of x to numer r taki, że r do potęgi 1/n to x.

W liczb rzeczywistych, istnieją pewne subcases:

  • Istnieją dwa rozwiązania (sama wartość z przeciwnym znakiem) jest dodatnia, gdy x i r jest parzysta.
  • Istnieje jedno pozytywne rozwiązanie, gdy x jest dodatnie i r jest dziwne.
  • Istnieje jedno negatywne rozwiązanie, gdy x ma wartość ujemną, a r jest nieparzyste.
  • Nie ma rozwiązania, gdy x jest ujemna, a r jest równa.

Od Math.pow nie lubi ujemną bazę z wykładnikiem nie całkowitą, można użyć

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

Przykłady:

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 (nie ma rozwiązania) " cóż ... przynajmniej nie w liczbach rzeczywistych – Moritz

2

Można użyć

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

Dla specjalnych przypadków kwadratowych i sześciennych jest najlepszy aby używać odpowiednio natywnych funkcji Math.sqrt i .

Na ES7 The exponentiation operator ** może być używany do obliczania pierwiastka n th jako/n do potęgi nieujemną zasady:

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

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

ten nie robi ale z negatywnymi zasadami.

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