View previous topic :: View next topic |
Author |
Message |
truevenik
Joined: 03 Feb 2004 Posts: 5
|
square roots to the nearest integer, without floating point |
Posted: Tue Mar 23, 2004 11:57 pm |
|
|
In case somebody else needs this, here's a routine that computes to the nearest integer the square-root of any unsigned 32-bit integer (eg. isqrt(10) = 3, isqrt(16) = 4 ). I needed this because I didn't have enough memory left to use floating point:
Code: |
int32 isqrt(int32 x)
{
int32 result = 0;
int8 bit;
for(bit = 15; bit != 0xFF; bit--) //while bit hasn't underflowed
{
bit_set(result, bit); //set the current bit
if(result*result > x) //if this makes the result > sqrt(x)
bit_clear(result, bit); //undo the bit-set
}
return result;
}
|
Note 1: This can be used to compute square roots of fixed point fractions as well - lets say you represent 65.32 as 6532 in your system. You want to compute sqrt(65.32) which will be represented as 100*sqrt(65.32). To do this you compute sqrt(6532*100). The reason 100*sqrt(65.32) is equivalent to sqrt(6532*100) is: 100*sqrt(65.32)= sqrt(100*100)*sqrt(65.32) = sqrt(65.32*100*100)
Note 2: The loop finds result through guess and check (binary search) by guessing result and then checking whether (result^2 > input). If it is then the guess was too big.
Note 3: I think logarithms to the nearest integer can be computed in a similar way: log(in) = result, in = 10^result, 10^result - in = 0. find result via binary-search.
Last edited by truevenik on Sat Apr 03, 2004 10:34 pm; edited 2 times in total |
|
|
jds-pic
Joined: 17 Sep 2003 Posts: 205
|
|
|
Guest
|
neat |
Posted: Wed Mar 24, 2004 1:14 pm |
|
|
Hi, can you explain the idea behind this algorithm (I don't remember learning this in grammar school ? |
|
|
mvaraujo
Joined: 20 Feb 2004 Posts: 59 Location: Brazil
|
SQRT of an 32bit integer, posting code. |
Posted: Tue Nov 30, 2004 7:56 am |
|
|
Hi All,
This message chain is old but I decided to post this code because it is pretty simple and can help other people that need to square a 32bit integer. It's small and fast, the best I've found in my searches until now.
Code: |
long uisqrt32(int32 r)
{
int32 t,b,c=0;
for (b=0x10000000;b!=0;b>>=2) {
t = c + b;
c >>= 1;
if (t <= r) {
r -= t;
c += b;
}
}
return(c);
}
|
It solved speed issues on my code. In comparison to sqrt() from math.h (float) it takes 1/5 of the run time. |
|
|
|