¿Quieres registrarte?

Aproximar raíces cuadradas para lograr un mejor rendimiento

6 de Julio del 2007
17,359 visitas

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 :wink: )

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.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript

Comentarios | Enviar un comentario
Excelente... o lo he podido ver en detalle, pero siempre aplaudiré el uso de la matemática en el actionscript! =D
Por: EverST_blog
hey saben como lograr hacer acelerar un MovieClic
si saben en vieenme el tutorial a
lowlanmx3000@hotmail.com
Por: lowland_blog
no entiendo
Por: jessica_blog
eeeehhh....Disculpen mi ignorancia, eso esta basado en un lenguaje de programacion en especial?
Por: Arturo_X

Arturo_X :

eeeehhh....Disculpen mi ignorancia, eso esta basado en un lenguaje de programacion en especial?


ActionScript U_U
Por: penHolder
Ahh, me olvidé de un detalle. En caso de que usen el código con una iteración, es mejor (para obtener una mayor velocidad de ejecución) quitar el for.

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: HernanRivas
solo quiero saber como se pueden resolber las raises cuadradas pero apenas estoy enpensandolkas apraticar asi que quisiera enpesar desde el principio se podiamos ablar por mi correo oxelnain@hotmail.com si no estoy conetado en ese en adios_mivida_1@hotmail.com
Por: vl (dj)_blog
esta super padre
Por: ana karen romero saldivar
quería saber una pagina donde te den las soluciones de las raices
Por: xica loka_blog
si puede ser podrian poner ejercicios de algoritmo para hacer de las raices cuadradas

xau!!!!!!!!!!!!
gracias!!!!!!!!!
Por: nena mona wapa_blog
podria poner el algoritmo de las raices cuadradas para hacer ejercicios
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: nena maona wapa
yo creo k deberian poner ejemplos de fraccionessssssssssssssssss
Por: la_lokiktaaaaaaaaaaa_blog
pero deben poner mas ejemplos y cosas de esas y mas raizes sin hacer
Por: carolina_blog
x favor podriais poner raices cdrds para q ls agms en internet
Por: elena_blog
quisiera hacer una raiz cuadrada simple
Por: roberta gomes_blog
plss k alguen me ponga una tabla de las putas raices cuadradas esas, k ya ni tengo ganas de pensar..[podridas las matematicas..!!]
Por: mi_blog
odios no me gustan las matematicas chau
Por: gaby_blog
hola como estan que bueno que utilicenesta paginay fui el primer lugar a nivel estatal de queretaro en la olimpiadas de matematicas...
soy genial no y si no me creen envienme un correo mggr_931219@hotmail.com
bye,bye
Por: MARYLU-blog
ASU MARE NO ENTIENDO NADA XD___pppp
Por: ANGELINA LA POLLO PELADO
deberian explicar bajo el lenguaje assembler por fis que es muy tedioso hacerlo y todabia no he podido para una practica de un lab que tengo que hacer me mandaron a sacar la raiz de 00 a 999 en assembler. gracias espero pronta respuesta por fis
Por: marlia alarcon-blog
pss muy bacano
too r bn
jejeje
Por: jessica-blog
pongalo en nuestro idioma
Por: vanessa_emo-blog
no le entiendo nada!!!!!
Por: yoooooo_emo-blog-blog
SI ALGUIEN LO PONE EN C o C++ se lo agradeceria :)
Por: elpapi.......-blog
pongan ejemplos de raices cuadradas pero ya resueltas porfa
Por: hgcdxzs-blog
DEBERIAN PONER LA TABLA DE LAS RAICES CUADRADAS FACTORIZABLE POR LO MENOS DEL 1 AL 500.GRACIAS
Por: gerardo_fany@live.co.uk-b
De berdad no entiendo nada y solo kiero ejenplos no esas ... "P..u..t..a...d...a...s" anda xfff
Por: .............-blog
qiero aprender aser raises cuadradas
Por: luiselpapi38@hotmil.com-b
nesesito la raises cuadrada de
258
Por: luiselpapi38@hotmail.com-
coimo puedosacar un ejerciocio de raiz cuadrada bueno no entiendo muy bien
Por: mary-blog
es una caca
Por: coco-blog
cabrón
Por: nuria-blog
Muy bueno!
Por: merlin1989
necesito las raizes del 1 al 500
Por: to-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.