Necesito algún algoritmo de división que pueda manejar enteros grandes (128 bits). Ya he preguntado cómo hacerlo a través de operadores de cambio de bit. Sin embargo, mi aplicación actual parece pedir un mejor enfoqueDivisión de números grandes
Básicamente, almacenar números como dos long long unsigned int
's en el formato
A * 2^64 + B
con B < 2^64
.
Este número es divisible por 24
y quiero dividirlo por 24
.
Mi enfoque actual es transformarla como
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
Sin embargo, esto está libre de errores.
(Tenga en cuenta que es A/24
baja y que es mod
A % 24
. Las divisiones normales se almacenan en long double
, los números enteros se almacenan en long long unsigned int
.
Desde 24
es igual a 11000
en binario, el segundo sumando no debería cambiar algo en el rango del cuarto summand ya que se desplaza 64 bits hacia la izquierda.
Entonces, si A * 2^64 + B
es divisible por 24, y B no lo es, muestra fácilmente que se produce un error ya que devuelve algunos no integrales número
¿Cuál es el error en mi implementación?
¿Cuál fue el problema con el enfoque de cambio de bit? –
parece exagerado cuando ya puede dividir el int64 – Etan