| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 |  | 
 | 2 | #include <linux/kernel.h> | 
 | 3 | #include <linux/module.h> | 
 | 4 |  | 
 | 5 | /** | 
 | 6 |  * int_sqrt - rough approximation to sqrt | 
 | 7 |  * @x: integer of which to calculate the sqrt | 
 | 8 |  * | 
 | 9 |  * A very rough approximation to the sqrt() function. | 
 | 10 |  */ | 
 | 11 | unsigned long int_sqrt(unsigned long x) | 
 | 12 | { | 
 | 13 | 	unsigned long op, res, one; | 
 | 14 |  | 
 | 15 | 	op = x; | 
 | 16 | 	res = 0; | 
 | 17 |  | 
| Peter Williams | f0c0025 | 2006-02-03 03:04:33 -0800 | [diff] [blame] | 18 | 	one = 1UL << (BITS_PER_LONG - 2); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 19 | 	while (one > op) | 
 | 20 | 		one >>= 2; | 
 | 21 |  | 
 | 22 | 	while (one != 0) { | 
 | 23 | 		if (op >= res + one) { | 
 | 24 | 			op = op - (res + one); | 
 | 25 | 			res = res +  2 * one; | 
 | 26 | 		} | 
 | 27 | 		res /= 2; | 
 | 28 | 		one /= 4; | 
 | 29 | 	} | 
 | 30 | 	return res; | 
 | 31 | } | 
 | 32 | EXPORT_SYMBOL(int_sqrt); |