Así que ver un montón de métodos que giran en torno Math.pow(...)
que es fresco, pero en base a la redacción de la generosidad que estoy proponiendo un enfoque ligeramente diferente.
Existen varias aproximaciones computacionales para resolver raíces, algunas dan pasos más rápidos que otras. En última instancia, el punto de detención se reduce al grado de precisión deseado (depende de usted/del problema que se resuelva).
No voy a explicar la matemáticas con gran detalle, pero los siguientes son puestas en práctica de aproximaciones de raíces cortadas en cubos que pasaron la prueba de destino (prueba de recompensa - rango negativo también agregó, debido al título de la pregunta). Cada iteración en el ciclo (ver los bucles while(Math.abs(xi-xi0)>precision)
en cada método) se acerca más a la precisión deseada. Una vez que se logra la precisión, se aplica un formato al número, por lo que es tan preciso como el cálculo derivado de la iteración.
var precision = 0.0000000000001;
function test_cuberoot_fn(fn) {
var tested = 0,
failed = 0;
for (var i = -100; i < 100; i++) {
var root = fn(i*i*i);
if (i !== root) {
console.log(i, root);
failed++;
}
tested++;
}
if (failed) {
console.log("failed %d/%d", failed, tested);
}else{
console.log("Passed test");
}
}
test_cuberoot_fn(newtonMethod);
test_cuberoot_fn(halleysMethod);
aproximación Implementación de Newton
function newtonMethod(cube){
if(cube == 0){//only John Skeet and Chuck Norris
return 0; //can divide by zero, we'll have
} //to settle for check and return
var xi = 1;
var xi0 = -1;
while(Math.abs(xi-xi0)>precision){//precision = 0.0000000000001
xi0=xi;
xi = (1/3)*((cube/(xi*xi))+2*xi);
}
return Number(xi.toPrecision(12));
}
Implementación aproximación Halley nota aproximación Halley toma medidas rápidas para resolver el cubo, por lo que es computacionalmente más rápido que la aproximación de Newton.
function halleysMethod(cube){
if(cube == 0){//only John Skeet and Chuck Norris
return 0; //can divide by zero, we'll have
} //to settle for check and return
var xi = 1;
var xi0 = -1;
while(Math.abs(xi-xi0)>precision){//precision = 0.0000000000001
xi0=xi;
xi = xi*((xi*xi*xi + 2*cube)/(2*xi*xi*xi+cube));
}
return Number(xi.toPrecision(12));
}
multiplican 8^1/3 por -1 :-) – noel
Hay una [raíz cúbica en ES6] nativo (http: //stackoverflow.com/a/29740048/1090562) –