Mi sono imbattuto in un problema: calcolare la radice quadrata di un intero senza utilizzare variabili floating point per motivi di velocità. Mi era sufficiente un risultato troncato e senza resto.
Spero di fare cosa gradita nel postare la funzione che ho scritto e che va aggiungersi alla libreria di quelle di uso generale perché l' esecuzione è molto veloce.
- Codice: Seleziona tutto
// Calcola la radice quadrata di un numero intero senza segno
uint32_t uintSqrt(uint32_t n) __pure
{
uint32_t i,val;
// se n vale 0 ritorna 0
if (!n) return 0;
// calcola il numero di bit di n
i = 0;
val = n;
do
{
val = val >> 1;
if (val) i++;
} while (val);
// assume val come 2^(i/2)
if (!i) val=1; else val = 1 << (i>>1);
// Calcola la radice babilonese.
// 4 passaggi sono sufficienti
for(i=0; i<4; i++) val = (val + n/val) >> 1;
return val;
}
Se provate a fare uintSqrt(4281346624) vi darà come risultato 65432.
