TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: afta en 17 de Diciembre de 2019, 15:29:31

Título: Raiz cuadrada
Publicado por: afta en 17 de Diciembre de 2019, 15:29:31
Hola alguien tendra informacion de una rutina para sacar la raiz cuadrada de un numero de 16 bits?. El resultado debe considerar punto decimal. He estado buscando informacion pero aún no tengo idea como hacerlo. Estoy usando ensamblador.
Gracias de antemano.
Título: Re:Raiz cuadrada
Publicado por: Picuino en 17 de Diciembre de 2019, 15:42:30
La fórmula es iterativa:

sqrt = ((numero/sqrt)+sqrt)/2

Comienzas por una aproximación a la raíz y en cada cálculo se obtienen más cifras correctas.
Título: Re:Raiz cuadrada
Publicado por: elreypic2 en 17 de Diciembre de 2019, 15:47:35
Aquí encontré algunas rutinas en ensamblador. Espero puedan servir.

http://www.massmind.org/techref/microchip/math/sqrt/index.htm

elreypic.
Título: Re:Raiz cuadrada
Publicado por: Picuino en 17 de Diciembre de 2019, 15:49:33
Por ejemplo raíz de 5320

Para conseguir la primera aproximación se divide el número de cifras entre dos. En binario es más exacto. En decimal no funciona igual de bien, pero para empezar da igual.

sqrt = 53   (El número inicial con la mitad de las cifras)

sqrt = (5320/53 + 53) / 2 = 76,69   (mejor aproximación)
sqrt = (5320/76,69 +76,69) / 2 = 73,03  (mejor aún)
sqrt = (5320/73.03 +73,03) / 2 = 72,93838  (mejor aún)

La respuesta real es sqrt = 72,93833

Un saludo.
Título: Re:Raiz cuadrada
Publicado por: afta en 17 de Diciembre de 2019, 16:17:56
Muchas gracias muchachos voy a poner en práctica sus sugerencias.
Título: Re:Raiz cuadrada
Publicado por: Picuino en 18 de Diciembre de 2019, 07:09:25
Una rutina en c para calcular la raíz de un numero entero de 32 bits:

Código: C
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. typedef unsigned char       uint8;  
  5. typedef unsigned short int  uint16;  
  6. typedef unsigned long int   uint32;  
  7.  
  8.  
  9. uint32 isqrt32(uint32 n) {
  10.     register uint32 root, remainder, place;  
  11.  
  12.     root = 0;  
  13.     remainder = n;  
  14.     place = 0x40000000;
  15.  
  16.     while (place > remainder)  
  17.         place >>= 2;  
  18.  
  19.     while (place) {
  20.         if (remainder >= root + place)  {  
  21.             remainder -= root + place;  
  22.             root += (place << 1);  
  23.         }  
  24.         root >>= 1;  
  25.         place >>= 2;  
  26.     }  
  27.     return root;  
  28. }
  29.  
  30.  
  31. main() {
  32.     uint32 sq, error;
  33.  
  34.     for(uint32 n=0; n<100000000; n=n+1+(n>>12)) {
  35.         sq = isqrt32(n);
  36.         error = sq - sqrt(n);
  37.         printf("isqrt(%lu)= %lu  error=%lu\n", n, sq, error);
  38.     }
  39. }

Viene de aquí:
http://www.codecodex.com/wiki/Calculate_an_integer_square_root#C