Мне нужен алгоритм деления, который может обрабатывать большие целые числа (128 бит). Я уже спрашивал, как это сделать с помощью операторов битового сдвига. Однако моя текущая реализация, похоже, требует лучшего подхода.
По сути, я храню числа как две long long unsigned int
в формате
A * 2 ^ 64 + B
с B < 2 ^ 64
.
Это число делится на 24
, и я хочу разделить его на 24
.
Мой текущий подход состоит в том, чтобы преобразовать его как
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
Однако это глючит.
(Обратите внимание, что этаж — это A / 24
, а mod
— это A % 24
. Обычные деления хранятся в long double
, а целые — в long long unsigned int
.
Поскольку 24
равно 11000
в двоичном виде, второе слагаемое не должно ничего менять в диапазоне четвертого слагаемого, поскольку оно сдвинуто на 64 бита влево.
Таким образом, если A * 2 ^ 64 + B
делится на 24, а B нет, это легко показывает, что оно содержит ошибку, поскольку возвращает какое-то нецелое число.
В чем ошибка в моей реализации?