A veces, especialmente en los videojuegos, necesitamos calcular distancias (por lo que necesitamos raíces cuadradas). La distancia al objetivo, al suelo, la distancia de penetración (para corregirla), etc...
El problema es que a veces, sea por el motivo que sea, terminamos acumulando raíces, ralentizando el programa inútilmente.
Como solución es muy útil aproximar las raíces, en este caso, propongo una forma bastante simple (hay varias):
Código :
raizNewton = function (numero:Number, iteraciones:Number, valorInicial:Number):Number { for (var i = 0; i < iteraciones; i++) { valorInicial = (valorInicial + numero / valorInicial) / 2; } return valorInicial; };(El nombre se lo puse en honor a quien la propuso)
¿Cómo funciona? No es demasiado complicado, geométricamente equivale a crear un cuadrado de área igual al número al que le queremos calcular la raíz y "hacerlo más cuadrado". Es decir, aumentamos el lado más grande y agrandamos el más chico hasta que sean iguales. En ese momento sus lados van a ser iguales a la raíz cuadrada del número deseado (por algo se llama raíz cuadrada )
Igualmente, un problema del algoritmo es que requiere que el valor inicial sea similar a la raíz.
Para ejemplificarlo, muestro distintos valores que va devolviendo la función:
Código :
trace (Math.sqrt(32)); //Output: 5.65685424949238 // trace (raizNewton(32, 1, 3)); //Output: 6.83333333333333 trace (raizNewton(32, 2, 3)); //Output: 5.75813008130081 // trace (raizNewton(32, 1, 4)); //Output: 6 trace (raizNewton(32, 2, 4)); //Output: 5.66666666666667 // trace (raizNewton(32, 1, 5)); //Output: 5.7 trace (raizNewton(32, 2, 5)); //Output: 5.65701754385965 // trace (raizNewton(32, 1, 6)); //Output: 5.66666666666667 trace (raizNewton(32, 2, 6)); //Output: 5.65686274509804 // trace (raizNewton(32, 4, 6)); //Output: 5.65685424949238
Noten que con una buena aproximación inicial (6) y 2 iteraciones, se consiguen 4 decimales correctos (con 1 iteración conseguimos 2). Mucho más de lo necesario. Finalmente, con sólo 4 iteraciones conseguimos un valor tan bueno como el de la función Math.sqrt();
Ahora bien, la utilidad de esto es que podemos decidir cuánta precisión pretendemos, en prácticamente todos los casos, aproximar con 1 o 2 decimales es suficientemente bueno (es más, hasta excesivamente bueno), y si, además, empleamos el último valor de la raíz como aproximación inicial, fotograma a fotograma va a ser más preciso. Mi consejo es no usar más de 1 o 2 iteraciones si podemos prescindir de la precisión en uno que otro fotograma (aunque podemos calcular la raíz inicialmente para tener un buen valor inicial).
Ésto resulta especialmente útil, ya que usando 1 o 2 iteraciones puede llegar a ser de 2 a 3 veces más rápido emplear este algoritmo que la función nativa (depende mucho del tamaño del número)
Por último, aclaro que es bastante fácil hacer ésto a mano (hasta mentalmente, dependiendo del valor) y que es un buen modo de calcular una raíz cuadrada si no se tiene una calculadora cerca.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por EverST el 09 de Julio de 2007
Por lowland el 10 de Julio de 2007
si saben en vieenme el tutorial a
[email protected]
Por jessica el 11 de Julio de 2007
Por Arturo_X el 11 de Julio de 2007
Por penHolder el 11 de Julio de 2007
Arturo_X :
ActionScript
Por HernanRivas el 13 de Julio de 2007
Incluso (aunque esto no lo pude corroborar), creo que con 2 iteraciones también conviene escribir el código sin usar el for.
Por último, jessica, el código es bastante simple. Lo que hago es esto:
Supongamos que quiero la raíz cuadrada de 64 (es 8, podés comprobarlo con una calculadora)
Lo que hago es construir un rectángulo de área 64, digamos 64x1
Ahora, busco hacerlo más cuadrado, divido el largo más grande por 2 y el más chico lo multiplico por 2; me queda un rectángulo de 32x2 (cuya área es también 64)
Lo hago de nuevo: 16x4 (otra vez, el área es 64)
Lo hago otra vez: 8x8 (el área sigue siendo 64)
En éste momento me doy cuenta de que ambos lados son idénticos, por lo que dejo de hacer cuentas y concluyo que la raíz cuadrada de 64 es 8.
En caso de querer sacar la raíz cúbica, hacemos algo similar, pero con un prisma rectangular que transformamos en cubo.
Fue Newton el que propuso éste método y también fue él el que escribió esta fórmula de manera recursiva (como una sucesión).
Por vl (dj) el 22 de Agosto de 2007
Por ana karen romero sal el 24 de Agosto de 2007
Por xica loka el 25 de Octubre de 2007
Por nena mona wapa el 11 de Noviembre de 2007
xau!!!!!!!!!!!!
gracias!!!!!!!!!
Por nena maona el 11 de Noviembre de 2007
porke ami me encanta hacer es super divertido y tambien poner las explicaciones
(porke esta pagina me la recomendo un profesor de mi instituto)
(y cuando me lo deijo creo k se decepcono mucho)
Por la_lokiktaaaaaaaaaaa el 27 de Noviembre de 2007
Por carolina el 04 de Diciembre de 2007
Por elena el 11 de Diciembre de 2007
Por roberta gomes el 24 de Enero de 2008
Por mi el 30 de Enero de 2008
Por gaby el 24 de Febrero de 2008
Por MARYLU el 16 de Mayo de 2008
soy genial no y si no me creen envienme un correo [email protected]
bye,bye
Por ANGELINA LA POLLO PE el 29 de Mayo de 2008
Por marlia alarcon el 02 de Julio de 2008
Por jessica el 12 de Julio de 2008
too r bn
jejeje
Por vanessa_emo el 01 de Agosto de 2008
Por yoooooo_emo-blog el 08 de Agosto de 2008
Por elpapi....... el 30 de Septiembre de 2008
Por hgcdxzs el 10 de Octubre de 2008
Por [email protected] el 02 de Diciembre de 2008
Por ............. el 10 de Diciembre de 2008
Por luiselpapi38@hotmil. el 11 de Febrero de 2009
Por luiselpapi38@hotmail el 11 de Febrero de 2009
258
Por mary el 14 de Junio de 2009
Por merlin1989 el 02 de Enero de 2010
Por to el 18 de Marzo de 2010
Por Arturo el 19 de Septiembre de 2012
gracias por el aporte