Karekök Bulmak: 16 bit Integer ile Çok Hızlı

Başlatan Erol YILMAZ, 31 Temmuz 2010, 10:06:03

Erol YILMAZ

Karekökü;
Derleyicilerin, genel matematik fonksiyonları, Float sayılar ile çok uzun sürelerde hesaplayabilmektedir.

Oysa bize INTEGER ve hızlı sonuç veren bir fonksiyon lazım ise ( ki genelde bu lazımdır )
aşağıdaki fonksiyonu kullanabilirsiniz....

Tarafımdan Hi-tech PICC'de True RMS hesaplarında başarı ile kullanılmıştır.

Embedded Yazılım sektöründe kabul görmüş bir uygulamadır.

2MIPS, PIC16 ile 440 uS'de sonucu vermektedir.

#define SQRT_ROUND 0 -> yuvarlama YOK
#define SQRT_ROUND 1 -> yuvarlama VAR

NOT : Kullandığınız C derleyiciye göre Typedef ile 16 bitlik tamsayıları ayarlamanız gerekmektedir.


#define SQRT_ROUND   0

INT16U sqrt16(INT16U A)
{
   INT16U x_sh ;
   INT16U bit_sh ;
   INT16U trial ;
   
   bit_sh = 0x4000 ;
   x_sh = 0 ;
   
   while ( bit_sh != 0 )
   {
      trial = x_sh + bit_sh ;
      if ( trial <= A )
      {
         A -= trial ;
         x_sh = trial + bit_sh ;
      }
      x_sh >>= 1 ;
      bit_sh >>= 2 ;
   }
#if SQRT_ROUND
   if ( A > x_sh )
   {
      ++ x_sh ;
   }
#endif
   
   return ( x_sh ) ;
}

Maxim

bende aynı şeyi protonda test ettim  (Proton + )

proteus simulasyon (7.2 SP6)
16F628A
8 mhz
süre 127us çıkıyor.

kod basitçe şöyle :

Dim Sonuc As Word
Dim Sayi As Word
'
Sayi=15482
Sonuc = Sqr Sayi