• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)17 unsigned 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