В продолжение темы про результатам работы за ночь: дана отсрочка до выходных. За ночь успел порыться в исходниках 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), а дальше кладем каждую цифру в контейнер как целое число, домножаем его на
![$10^n$ $10^n$](https://dxdy-03.korotkov.co.uk/f/6/4/e/64ed176eb197b5f975b862ab24d225a582.png)
(
![$10 \times 10 \times 10 \dots \times 10$ $10 \times 10 \times 10 \dots \times 10$](https://dxdy-01.korotkov.co.uk/f/c/4/b/c4b56fd1a3ba9a98fea4ee53e150ad8682.png)
или
![$1/10/10/10 \dots /10$ $1/10/10/10 \dots /10$](https://dxdy-03.korotkov.co.uk/f/6/4/6/6465c49324e35d3460a441e294041eba82.png)
) и складываем их все в результат.
Чтобы вывести произвольное вещественное число в десятичном виде я пока не очень понимаю, что нужно сделать, но, видимо, это тоже решается как-то просто и аналогично.
Как реализовать сложение и вычитание однознаковых двоичных дробных чисел я себе более ли менее представляю - привести к одной экспоненте и сделать в столбик. С делением хуже - мне сейчас вообще не приходит в голову, как это реализовать. Помню, в школе, когда-то уголком делили дробные на целые...
Поэтому прошу всех участников, если у них есть такая возможность, поделиться простыми исходниками на любом языке или по крайней мере формализованными алгоритмами для этих операций. Скорость их выполнения и требуемые ресурсы совершенно не важны, поэтому можно делать самым "глупым" и простым способом.
Задача, по-моему, интересная, исходный код я без проблем в итоге могу опубликовать для потомков, я бы с удовольствием посвятил ей гораздо больше времени самостоятельно, если бы оно вообще у меня было.