From 66559340d640e0a1cbeaf69fbda59f967aab4b0c Mon Sep 17 00:00:00 2001 From: martin-s Date: Tue, 25 Aug 2009 21:04:33 +0000 Subject: [PATCH] Fix:Core:Improved int_sqrt git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2530 ffa7fe5e-494d-0410-b361-a75ebd5db220 --- navit/navit/graphics.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/navit/navit/graphics.c b/navit/navit/graphics.c index 8fe2372..a7f75ac 100644 --- a/navit/navit/graphics.c +++ b/navit/navit/graphics.c @@ -999,21 +999,25 @@ static int int_sqrt(unsigned int n) { unsigned int h, p= 0, q= 1, r= n; - while ( q <= n ) { - q <<= 2; - if(q == 0) { - return (int) sqrtf( (float) n ); /* use float sqrt if we reach q MAX */ - } - } - - while ( q != 1 ) { + + /* avoid q rollover */ + if(n > (1<<(sizeof(n)*8-1))) { + q = 1<<(sizeof(n)*8-1); + } else { + while ( q <= n ) { + q <<= 2; + } q >>= 2; + } + + while ( q != 0 ) { h = p + q; p >>= 1; if ( r >= h ) { p += q; r -= h; - } + } + q >>= 2; } return p; } -- 2.7.4