В продолжение темы про результатам работы за ночь: дана отсрочка до выходных. За ночь успел порыться в исходниках GCC на тему как же там эмулируется soft-FPU для архитектур, в которых не предусмотрено операций для работы с вещественными числами. Оказалось, меняется сама постановка задачи, о чем как-то не додумался. Ключевой момент тут в том, что мы должны обойтись без вещественных чисел, которые мы как раз реализуем, но любые операции над полем вещественных чисел, которые мы уже реализовали использовать имеем полное право.
Таким образом, soft-FPU, как я понял, там (в GCC / libc) реализуется следующим способом:
- Сначала реализуют элементарные операции с вещественными числами, а именно + и /.
- Затем реализуют операции сравнения <, > и = (>= и <= через <, >, =).
- Через (1) + (2) реализуют - и *. Примеры: 1 - 2 = 1 + (-2); 1 * 2 = 1 / (1 / 2 ).
- Дальше реализуют загрузку целых чисел в контейнер - это тривиально и может быть сделано только целочисленными операциями. Причем, чтобы сильно не думать, т.е. не делать самим перевод из десятичной в двоичную систему, берут готовую реализацию загрузки десятичных целых чисел и протыкивают 4-байтный контейнер int по битам, а затем копируют в контейнер IEEE754 с соответствующей экспонентой.
- Теперь можно получить любое наперед заданное вещественное число простым делением двух целых чисел и результат окажется автоматически в контейнере. Пример: 0.1 = 1 / 10.
Чтобы загрузить произвольное вещественное число из строки в контейнер, мы нормализуем его (приводим к виду +/-0.XXXXE+/-Y), а дальше кладем каждую цифру в контейнер как целое число, домножаем его на

(

или

) и складываем их все в результат.
Чтобы вывести произвольное вещественное число в десятичном виде я пока не очень понимаю, что нужно сделать, но, видимо, это тоже решается как-то просто и аналогично.
Как реализовать сложение и вычитание однознаковых двоичных дробных чисел я себе более ли менее представляю - привести к одной экспоненте и сделать в столбик. С делением хуже - мне сейчас вообще не приходит в голову, как это реализовать. Помню, в школе, когда-то уголком делили дробные на целые...
Поэтому прошу всех участников, если у них есть такая возможность, поделиться простыми исходниками на любом языке или по крайней мере формализованными алгоритмами для этих операций. Скорость их выполнения и требуемые ресурсы совершенно не важны, поэтому можно делать самым "глупым" и простым способом.
Задача, по-моему, интересная, исходный код я без проблем в итоге могу опубликовать для потомков, я бы с удовольствием посвятил ей гораздо больше времени самостоятельно, если бы оно вообще у меня было.