spamsink: (Default)
spamsink ([personal profile] spamsink) wrote2021-12-02 01:28 pm

Как двоичный корень извлечь

Вы не поверите, насколько просто, оказывается, извлекать вручную квадратный корень в двоичной системе!

https://projectf.io/posts/square-root-in-verilog/

В отличие от десятичной системы, в двоичной это практически в точности как деление столбиком, только знай себе приписывай к пробному "делителю" справа 01.

Например, вычислим корень из 2 с точностью до скольких-нибудь знаков. Припишем к числу 10 несколько групп из пар нулей: 10 00 00 00 00 ...

Дальше будем думать в терминах "текущего остатка" и "текущего результата", первоначально пустых.

Основной шаг алгоритма таков:


  • Добавим справа к текущему остатку очередную пару бит аргумента.
  • Для пробы добавим справа к текущему результату магическую пару бит 01.
  • Сравним текущий остаток и пробный результат. Если остаток меньше, то припишем справа к текущему результату 0; иначе вычтем пробный результат из текущего остатка и припишем справа к текущему результату 1.


Для данного примера имеем:









ОстатокПробаРезультатКомментарий
1001110 - 01 = 01 в остатке
01 001 0110остаток не изменился
01 00 0010 0110110000 - 1001 = 111 в остатке
01 11 001 01 01101111100-10101 = 111 в остатке
01 11 0010 11 0110110остаток не изменился
01 11 00 001 01 10 011011011110000-1011001=10111
01 01 11 0010 11 01 011011010...


Действительно, корень из 2 в двоичной системе начинается с 1.011010...

Даже странно, что в современных компьютерах нет операции целочисленного квадратного корня.
nicolas83: (Default)

[personal profile] nicolas83 2021-12-03 03:42 pm (UTC)(link)
Хм, а дело хуже, чем я только мог предположить... :-)