diff options
Diffstat (limited to 'lib/int_sqrt.c')
-rw-r--r-- | lib/int_sqrt.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/int_sqrt.c b/lib/int_sqrt.c new file mode 100644 index 0000000..a5d2cdc --- /dev/null +++ b/lib/int_sqrt.c @@ -0,0 +1,32 @@ + +#include <linux/kernel.h> +#include <linux/module.h> + +/** + * int_sqrt - rough approximation to sqrt + * @x: integer of which to calculate the sqrt + * + * A very rough approximation to the sqrt() function. + */ +unsigned long int_sqrt(unsigned long x) +{ + unsigned long op, res, one; + + op = x; + res = 0; + + one = 1 << 30; + 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; +} +EXPORT_SYMBOL(int_sqrt); |