From d3b7b89493e025654d218fb77da095649b4f6ba2 Mon Sep 17 00:00:00 2001 From: michi_cc Date: Sat, 3 Dec 2011 23:40:46 +0000 Subject: (svn r23415) -Feature: Infrastructure maintenance costs. --- src/core/math_func.cpp | 30 ++++++++++++++++++++++++++++++ src/core/math_func.hpp | 2 ++ 2 files changed, 32 insertions(+) (limited to 'src/core') diff --git a/src/core/math_func.cpp b/src/core/math_func.cpp index 7f0630a97..2b8ca3309 100644 --- a/src/core/math_func.cpp +++ b/src/core/math_func.cpp @@ -46,3 +46,33 @@ int GreatestCommonDivisor(int a, int b) return a; } + +/** + * Compute the integer square root. + * @param num Radicand. + * @return Rounded integer square root. + * @note Algorithm taken from http://en.wikipedia.org/wiki/Methods_of_computing_square_roots + */ +uint32 IntSqrt(uint32 num) +{ + uint32 res = 0; + uint32 bit = 1UL << 30; // Second to top bit number. + + /* 'bit' starts at the highest power of four <= the argument. */ + while (bit > num) bit >>= 2; + + while (bit != 0) { + if (num >= res + bit) { + num -= res + bit; + res = (res >> 1) + bit; + } else { + res >>= 1; + } + bit >>= 2; + } + + /* Arithmetic rounding to nearest integer. */ + if (num > res) res++; + + return res; +} diff --git a/src/core/math_func.hpp b/src/core/math_func.hpp index 19f2f53d6..92893ed31 100644 --- a/src/core/math_func.hpp +++ b/src/core/math_func.hpp @@ -346,4 +346,6 @@ static FORCEINLINE int RoundDivSU(int a, uint b) } } +uint32 IntSqrt(uint32 num); + #endif /* MATH_FUNC_HPP */ -- cgit v1.2.3-54-g00ecf