linux/lib/int_sqrt.c
<<
>>
Prefs
   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);
  39