Line data Source code
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 : */
17 2 : unsigned long int_sqrt(unsigned long x)
18 : {
19 : unsigned long b, m, y = 0;
20 :
21 2 : if (x <= 1)
22 : return x;
23 :
24 : m = 1UL << (BITS_PER_LONG - 2);
25 34 : while (m != 0) {
26 32 : b = y + m;
27 32 : y >>= 1;
28 :
29 32 : if (x >= b) {
30 11 : x -= b;
31 11 : y += m;
32 : }
33 32 : m >>= 2;
34 : }
35 :
36 : return y;
37 : }
38 : EXPORT_SYMBOL(int_sqrt);
|