Für den MSP430G2553 habe ich leider keinen schnellen Assembler-Code
gefunden um die Wurzel schnell zu berechnen. Hier im Forum habe ich zwar
einige c-codes gefunden, allerdings waren diese meist sehr langsam.
Stellenweise sogar über 5000 Taktzyklen.
Auf der Webseite
http://www.codecodex.com/wiki/Calculate_an_integer_square_root
habe ich einen passenden und schnellen c-code gefunden (ca. 420 clocks).
Die Zahlen bis 2^20 habe ich geprüft. Diese Routine rundet immer ab,
also aus 5,9 wird 5.
1 | unsigned int isqrt32 (unsigned long int n) // OR isqrt16 ( uint16 n ) OR isqrt8 ( uint8 n ) - respectively [ OR overloaded as isqrt (uint?? n) in C++ ]
|
2 | {
|
3 | register long unsigned int // OR register uint16 OR register uint8 - respectively
|
4 | root, remainder, place;
|
5 |
|
6 | root = 0;
|
7 | remainder = n;
|
8 | place = 0x40000000; // OR place = 0x4000; OR place = 0x40; - respectively
|
9 |
|
10 | while (place > remainder)
|
11 | place = place >> 2;
|
12 | while (place)
|
13 | {
|
14 | if (remainder >= root + place)
|
15 | {
|
16 | remainder = remainder - root - place;
|
17 | root = root + (place << 1);
|
18 | }
|
19 | root = root >> 1;
|
20 | place = place >> 2;
|
21 | }
|
22 | return root;
|
23 | }
|
Diese Beitrag ist eigentlich nur für die Suche, man muss ja nicht immer
mehrmals das Rad neu erfinden.