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