Ho bisogno di un algoritmo di divisione in grado di gestire interi grandi (128 bit). Ho già chiesto come farlo tramite gli operatori di cambio di bit. Tuttavia, la mia attuale implementazione sembra chiedere per un migliore approccioDivisione di grandi numeri
Fondamentalmente, ho memorizzare i numeri come due long long unsigned int
s' nel formato
A * 2^64 + B
con B < 2^64
.
Questo numero è divisibile per 24
e voglio dividerlo per 24
.
Il mio approccio attuale è quella di trasformarlo come
A * 2^64 + B A B
-------------- = ---- * 2^64 + ----
24 24 24
A A mod 24 B B mod 24
= floor(----) * 2^64 + ---------- * 2^64 + floor(----) + ----------
24 24.0 24 24.0
Tuttavia, questo è bacato.
(Si noti che piano è A/24
e che mod
è A % 24
. Le divisioni normali sono memorizzati in long double
, gli interi sono memorizzati in long long unsigned int
.
Dal 24
è pari a 11000
in binario, il secondo addendo non dovrebbe cambia qualcosa nell'intervallo del quarto summmo poiché è spostato a 64 bit a sinistra
Quindi, se A * 2^64 + B
è divisibile per 24, e B non lo è, mostra facilmente che si tratta di bug poiché restituisce alcuni elementi non integrali numero
Qual è l'errore nella mia implementazione?
Qual è stato il problema con l'approccio del cambio di bit? –
sembra essere eccessivo quando si è già in grado di dividere lo – Etan