Вы можете разбить большее деление на несколько кусков, которые делят с меньшим количеством битов. Как уже упоминалось в другом постере, алгоритм можно найти в TAOCP от Кнута.
Однако, не нужно покупать книгу!
На веб-сайте восхищения хакерами есть код, который реализует алгоритм на языке C. Он написан для выполнения 64-битных беззнаковых делений, используя только 32-битную арифметику, поэтому вы не можете напрямую вырезать и вставить код. Чтобы получить от 64 до 128 бит, вы должны расширить все типы, маски и константы на два, например. короткое становится int, 0xffff становится 0xffffffffll ect.
После этого простого и легкого изменения вы сможете делать 128-битные деления.
Код здесь: http://www.hackersdelight.org/HDcode/divlu.c (может плохо переноситься в веб-браузере из-за окончания строки. Если это так, просто сохраните код и откройте его в блокноте или около того).
Поскольку вашим самым большим значениям требуется только 96 бит, одно из 64-битных делений будет всегда возвращать ноль, так что вы даже можете немного упростить код.
Да, и прежде, чем я это забуду: код работает только со значениями без знака. Чтобы преобразовать деление со знаком в беззнаковое, вы можете сделать что-то вроде этого (стиль псевдокода):
fixpoint Divide (fixpoint a, fixpoint b)
{
// check if the integers are of different sign:
fixpoint sign_difference = a ^ b;
// do unsigned division:
fixpoint x = unsigned_divide (abs(a), abs(b));
// if the signs have been different: negate the result.
if (sign_difference < 0)
{
x = -x;
}
return x;
}
Стоит также проверить сам сайт: http://www.hackersdelight.org/
Надеюсь, это поможет.
Кстати - отличное задание, над которым вы работаете ... Не могли бы вы рассказать нам, для чего вам нужна библиотека с фиксированной точкой?
Кстати - обычный алгоритм сдвига и вычитания для деления тоже подойдет.
Если вы нацелены на x86, вы можете реализовать его с помощью встроенных функций MMX или SSE. Алгоритм опирается только на примитивные операции, поэтому он также может выполнять довольно быстро.