Messages in this thread Patch in this message | | | Date | Wed, 16 Jul 2008 13:19:31 -0700 (PDT) | From | Soumyadip Das Mahapatra <> | Subject | [PATCH] : A better approach to compute int_sqrt in lib/int_sqrt.c |
| |
Hello everybody !! The patch below is what i think is a better approach to compute int_sqrt().
What about it ?
Thanks !!
--- --- a/lib/int_sqrt.c 2008-04-17 08:19:44.000000000 +0530 +++ b/lib/int_sqrt.c 2008-07-02 11:37:01.000000000 +0530 @@ -1,4 +1,3 @@ - #include <linux/kernel.h> #include <linux/module.h> @@ -7,26 +6,21 @@ * @x: integer of which to calculate the sqrt * * A very rough approximation to the sqrt() function. + * Improved version from the previous one. */ unsigned long int_sqrt(unsigned long x) { - unsigned long op, res, one; - - op = x; - res = 0; - - one = 1UL << (BITS_PER_LONG - 2); - while (one > op) - one >>= 2; - - while (one != 0) { - if (op >= res + one) { - op = op - (res + one); - res = res + 2 * one; - } - res /= 2; - one /= 4; - } - return res; + unsigned long ub, lb, m; + lb = 1; /* lower bound */ + ub = (x >> 5) + 8; /* upper bound */ + do { + m = (ub + lb) >> 1; /* middle value */ + if((m * m) > x) + ub = m - 1; + else + lb = m + 1; + } while(ub >= lb); + + return lb - 1; } EXPORT_SYMBOL(int_sqrt);
| |