Attualmente sto scrivendo una libreria matematica rapida a 32.32 punti fissi. Sono riuscito a fare correttamente l'aggiunta, la sottrazione e la moltiplicazione, ma sono abbastanza bloccato alla divisione.Ho bisogno di un veloce 96-bit su algoritmo di divisione specifico a 64 bit per una libreria matematica a virgola fissa
Un piccolo promemoria per coloro che non riescono a ricordare: un numero a 32.32 in virgola fissa è un numero con 32 bit di parte intera e 32 bit di parte frazionaria.
Il miglior algoritmo che ho trovato ha bisogno della divisione integer a 96 bit, che è qualcosa per cui i compilatori di solito non hanno built-in.
In ogni caso, qui va:
G = 2^32
notation: x is the 64-bit fixed-point number, x1 is its low nibble and x2 is its high
G*(a/b) = ((a1 + a2*G)/(b1 + b2*G))*G // Decompose this
G*(a/b) = (a1*G)/(b1*G + b2) + (a2*G*G)/(b1*G + b2)
Come si può vedere, la (a2*G*G)
è garantito per essere più grande del normale a 64 bit integer. Se uint128_t di stati effettivamente sostenuti dal mio compilatore, vorrei semplicemente fare quanto segue:
((uint128_t)x << 32)/y)
Beh non lo sono e ho bisogno di una soluzione. Grazie per l'aiuto.
"typedef struct {unsigned long u [4];} __attribute ((aligned (16))) __uint128_t;" Rubato a GCC e probabilmente non funzionerà altrove (e probabilmente non è necessario con GCC.) Sì, dubito che questo sia di aiuto. – Brian