Компромисс довольно прост.LUT использует дополнительную память в надежде уменьшить количество команд, достаточное для экономии времени.Будет ли он эффективным, во многом будет зависеть от деталей процессора - в частности, от кеширования.
Для Ньютона-Рафсона вы меняете X / Y на X * (1 / Y) и используете свою итерацию, чтобы найти 1 / Y.По крайней мере, по моему опыту, если вам нужна полная точность, она редко полезна - ее основная сила в том, чтобы вы могли быстрее находить (скажем) 16-битную точность.
Обычный метод деления - побитовый метод .Хотя этот конкретный ответ имеет дело с целыми числами, для плавающей запятой вы делаете по существу то же самое, за исключением того, что вместе с ним вычитаете экспоненты.Число с плавающей запятой в основном равно A * 2 N , где A - это значение, а N - экспоненциальная часть числа.Итак, вы берете два числа A * 2 N / B * 2 M и выполняете деление как A / B * 2 NM , с A иВ этом случае B рассматривается как (по существу) целое число.Единственная реальная разница в том, что с плавающей запятой вы обычно хотите округлять, а не усекать результат.По сути, это просто означает выполнение деления (как минимум) одного дополнительного бита точности, а затем округление в большую сторону, если этот дополнительный бит равен единице.
Наиболее распространенный метод с использованием справочных таблиц - это SRT-деление.Чаще всего это делается аппаратно, так что я бы, вероятно, использовал Google для чего-то вроде «Verilog SRT» или «VHDL SRT».Рендеринг в C ++ не должен быть очень сложным.Если метод, который я описал в связанном ответе, производит по битам на итерацию, это можно записать для выполнения 2, 4 и т. Д. Если память используется, размер таблицы увеличивается в квадрате по сравнению с количеством битов, создаваемых за одну итерацию, поэтому вы редкоувидеть гораздо больше 4 на практике.