1 /* 2 * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com> 3 * 4 * Based on the shift-and-subtract algorithm for computing integer 5 * square root from Guy L. Steele. 6 */ 7 8 #include <linux/kernel.h> 9 #include <linux/export.h> 10 11 /** 12 * int_sqrt - rough approximation to sqrt 13 * @x: integer of which to calculate the sqrt 14 * 15 * A very rough approximation to the sqrt() function. 16 */ int_sqrt(unsigned long x)17unsigned long int_sqrt(unsigned long x) 18 { 19 unsigned long b, m, y = 0; 20 21 if (x <= 1) 22 return x; 23 24 m = 1UL << (BITS_PER_LONG - 2); 25 while (m != 0) { 26 b = y + m; 27 y >>= 1; 28 29 if (x >= b) { 30 x -= b; 31 y += m; 32 } 33 m >>= 2; 34 } 35 36 return y; 37 } 38 EXPORT_SYMBOL(int_sqrt); 39