Autor Tema: Raiz cuadrada  (Leído 2544 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Raiz cuadrada
« 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Raiz cuadrada
« Respuesta #1 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Raiz cuadrada
« Respuesta #2 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Raiz cuadrada
« Respuesta #3 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.
« Última modificación: 17 de Diciembre de 2019, 15:52:41 por Picuino »

Desconectado afta

  • PIC16
  • ***
  • Mensajes: 123
Re:Raiz cuadrada
« Respuesta #4 en: 17 de Diciembre de 2019, 16:17:56 »
Muchas gracias muchachos voy a poner en práctica sus sugerencias.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Raiz cuadrada
« Respuesta #5 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


 

anything