Dec. 2nd, 2021

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

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...

Даже странно, что в современных компьютерах нет операции целочисленного квадратного корня.
spamsink: (Default)
Я думал, что меня уже трудно чем-то неприятно удивить. Оказалось, что я ошибался.

попробуйте и вы )
Page generated Feb. 23rd, 2026 07:03 am
Powered by Dreamwidth Studios