Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[linux/fpc-iii.git] / lib / int_sqrt.c
blob1ef4cc344977cda2886ec1033a0868cec4a8ec41
1 /*
2 * Copyright (C) 2013 Davidlohr Bueso <davidlohr.bueso@hp.com>
4 * Based on the shift-and-subtract algorithm for computing integer
5 * square root from Guy L. Steele.
6 */
8 #include <linux/kernel.h>
9 #include <linux/export.h>
11 /**
12 * int_sqrt - rough approximation to sqrt
13 * @x: integer of which to calculate the sqrt
15 * A very rough approximation to the sqrt() function.
17 unsigned long int_sqrt(unsigned long x)
19 unsigned long b, m, y = 0;
21 if (x <= 1)
22 return x;
24 m = 1UL << (BITS_PER_LONG - 2);
25 while (m != 0) {
26 b = y + m;
27 y >>= 1;
29 if (x >= b) {
30 x -= b;
31 y += m;
33 m >>= 2;
36 return y;
38 EXPORT_SYMBOL(int_sqrt);