Loading...
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 */
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}
38EXPORT_SYMBOL(int_sqrt);
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 */
11unsigned long int_sqrt(unsigned long x)
12{
13 unsigned long op, res, one;
14
15 op = x;
16 res = 0;
17
18 one = 1UL << (BITS_PER_LONG - 2);
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}
32EXPORT_SYMBOL(int_sqrt);