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

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

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

Date: 2021-12-03 02:32 am (UTC)
sobriquet9: (Default)
From: [personal profile] sobriquet9
Похоже на метод поиска верблюда в пустыне последовательным делением области поиска пополам. Поднимаем по одному биты, начиная со старших, если квадрат получился больше - опускаем обратно, поднимаем следующий бит. Если квадрат получился меньше - оставляем поднятым и переходим к следующему биту.

Date: 2021-12-03 05:38 pm (UTC)
sobriquet9: (Default)
From: [personal profile] sobriquet9
Квадрат мы всё равно считаем, только не каждый раз целиком, а один раз и постепенно, добавляя по одной четверичной цифре за итерацию.

Date: 2021-12-03 04:13 am (UTC)
nicolas83: (Default)
From: [personal profile] nicolas83
Корень из 2х = 1.4142135 (с деццтва помню).

Date: 2021-12-03 04:40 am (UTC)
nicolas83: (Default)
From: [personal profile] nicolas83
Сэр, Вы зануда.

Догадываюсь, что, если бы я написал "корень из 2-х", Вы бы не преминули определить, что х ≤2.

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

Profile

spamsink: (Default)
spamsink

June 2025

S M T W T F S
1 2 34567
89 1011 121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 14th, 2025 05:25 pm
Powered by Dreamwidth Studios