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 ) ;
}
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