From 4aefda6f17c1e4e8f9dba03e5f6be20ba673727a Mon Sep 17 00:00:00 2001 From: Michael Moon Date: Thu, 24 Feb 2011 18:49:28 +1100 Subject: [PATCH] added integer square root algorithm for future use --- dda.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/dda.c b/dda.c index 03fbff8..6a3f470 100644 --- a/dda.c +++ b/dda.c @@ -100,6 +100,25 @@ uint32_t approx_distance_3( uint32_t dx, uint32_t dy, uint32_t dz ) return (( approx + 512 ) >> 10 ); } +// courtesy of http://www.embedded-systems.com/98/9802fe2.htm +uint16_t int_sqrt(uint32_t a) { + uint32_t rem = 0; + uint32_t root = 0; + for (uint16_t i = 0; i < 16; i++) { + root <<= 1; + rem = ((rem << 2) + (a >> 30)); + a <<= 2; + root++; + if (root <= rem) { + rem -= root; + root++; + } + else + root--; + } + return (uint16_t) ((root >> 1) & 0xFFFFL); +} + // this is an ultra-crude pseudo-logarithm routine, such that: // 2 ^ msbloc(v) >= v const uint8_t msbloc (uint32_t v) {