summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/math_func.cpp30
-rw-r--r--src/core/math_func.hpp2
2 files changed, 32 insertions, 0 deletions
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 */