2011-09-05 30 views
52

Estoy tratando de obtener la enésima raíz de un número usando JavaScript, pero no veo la manera de hacerlo utilizando el objeto Math incorporado. ¿Estoy pasando por alto algo?
Si no ...JavaScript: Calcula la enésima raíz de un número

¿Existe una biblioteca de matemáticas que pueda usar que tenga esta funcionalidad?
Si no ...

¿Cuál es el mejor algoritmo para hacer esto yo mismo?

+0

¿Cuántas raíces quieres? ¿Solo el más obvio, o todos ellos? –

Respuesta

92

¿Se puede usar algo como esto?

Math.pow(n, 1/root); 

por ejemplo.

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

Esto funcionará si la función pow puede tomar un exponente fraccionario. No estoy seguro, pero _debe_ :) –

+0

pero no maneja los números negativos – mplungjan

+1

Una pequeña nota. La función pow se aproxima a la respuesta. Entonces, para valores grandes, esta aproximación puede devolver números muy incorrectos. [[reference] (http://stackoverflow.com/questions/9956471/wrong-result-by-java-math-pow)]. Lo mismo es cierto para la implementación de JS. [ref] (http://www.ecma-international.org/ecma-262/6.0/#sec-math.pow) –

16

La raíz n th de x es lo mismo que x a la potencia de 1/n. Usted puede simplemente utilizar Math.pow:

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

Uso Math.pow()

Tenga en cuenta que no maneja muy bien negativo - que aquí hay una discusión y un código que hace

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

El n - La raíz th de x es un número r tal que r a la potencia de 1/n es x.

En números reales, existen algunas sub-casos:

  • Hay dos soluciones (mismo valor con signo opuesto) cuando x es positivo y r es par.
  • Hay una solución positiva cuando x es positivo y r es impar.
  • Hay una solución negativa cuando x es negativo y r es impar.
  • No hay solución cuando x es negativo y r es par.

Desde Math.pow no le gusta una base negativa con un exponente no entero, se puede utilizar

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

Ejemplos:

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 (no hay solución) " bueno ... al menos no en números reales – Moritz

2

Usted podría utilizar

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

Para los casos especiales de raíz cuadrada y cúbica, es mejor para usar las funciones nativas Math.sqrt y Math.cbrt respectivamente.

Como de ES7, la exponentiation operator ** se puede utilizar para calcular el n º raíz que la /n ésima potencia de una base no negativo:

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

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

Este doesn No funciona con bases negativas, sin embargo.

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