Операция извлечения квадратного корня




К основным арифметическим операциям относятся сложение, вычитание, умножение и деление. Время их выполнения определяет быстродействие ЭВМ. Автоматическое выполнение не основных операций организуется в том случае, если такая операция составляет не менее 2% от общего числа операций или является составной частью алгоритмов, которые необходимо выполнять в реальном времени, т.е. с большим быстродействием. Не основные арифметические операции реализуются обычно с помощью стандартных программ, которые входят в состав математического обеспечения ЭВМ и вызываются простым обращением к соответствующей библиотеке подпрограмм. Однако для реализации этих подпрограмм требуется значительно больше времени, чем для выполнения основных арифметических операций.

Вместе с тем в настоящее время существенно повысилась степень интеграции и снизилась стоимость электронных компонентов ЭВМ. В связи с этим стал актуальным вопрос о передаче части функций МО ЭВМ аппаратным средствам. Прежде всего это касается выполнения сложных арифметических операций, таких как перевод чисел из одной системы счисления в другую, вычисление численного значения многочлена, вычисление элементарных функций, извлечение корня квадратного, выполнение операций комплексной арифметики. При этом интерес представляет исследование таких методов вычислений указанных операций, которые допускают аппаратную реализацию за время, соизмеримое со временем выполнения основных операций.

Естественно, что алгоритм выполнения неосновных арифметических операций, ориентированные на аппаратурную реализацию, как правило, существенно отличаются от алгоритмов программной реализации, так как первые обычно строятся на основе многократного выполнения операций сложения и сдвигов.

Имеются два пути решения задачи извлечения корня квадратного.

Первый способ связан с разработкой микропрограммы извлечения корня квадратного с использованием набора основных арифметических операций. При этом программа реализует один из известных итерационных методов извлечения корня с помощью базовой аппаратуры. Например, в универсальных ЭВМ используется обычно известная формула Ньютона:

Bi+1 = 0,5 (Bi + A/Bi ),

где Bi+1 есть (i+1)-е приближение , i=0, 1, 2,...

Второй способ состоит в создании алгоритма, похожего по структуре на алгоритмы основных арифметических операций, например, деления.

Наиболее простой алгоритм сводится к подбору цифр результата разряд за разрядом, начиная со старшего, т.е. имеющего вес 2-1.

Вычисление i-й цифры В:

· после получения (i-1)-й цифры В (bi-1) в i - й разряд В для пробы помещается 1.

· вычисляется разность (A - Bi)2=Ri.

· если Ri > 0, то сохраняется bi=1, иначе bi = 0.

· перейти к вычислению (i+1)-й цифры.

Определение остатка Ri = A - является сложной процедурой, выполнение которой нежелательно. Поэтому используется рекуррентная формула для получения Ri из Ri-1. Допустим, что найдены первые (i-1) цифр из B=0,b1b2b3...bi-1. Очевидно, что Bi-1 - наибольшее число из (i-1) разрядов, для которого т.е.

Следующая i-я цифра т.е. Bi=0,b1b2...bi-10 или Bi=0,b1b2...1.

При Ri ³ 0 принимается bi=1, иначе bi=0.

Остаток Ri при bi=1 можно получить следующим образом:

Следующая цифра bi+1 определяется так же, если Ri ³ 0. Если Ri < 0, то прежде чем вычислять следующую цифру, необходимо восстановить предыдущий остаток, т.е. получить

Затем в следующем такте вычислить следующий остаток:

Новая цифра результата равна инверсному значению знаковой цифры остатка Ri+1.

Таким образом, чтобы получить остаток Ri нужно к Bi-1 приписать справа пару цифр 01, сдвинуть его на (i-1) разрядов вправо и вычесть из предыдущего остатка Ri-1. Если Ri ³ 0, то bi=1, если Ri < 0, то bi = 0. В последнем случае необходимо восстановить предыдущий остаток и приступить к вычислению следующей цифры.

Такой способ проще, чем вычисление разности . Он лучше поддается автоматизации и может быть реализован в виде самостоятельной операции.

Как и при делении можно отказаться от восстановления остатка. В этом случае, если Ri < 0, то bi=0, а в следующем цикле к Bi добавляется не 01, а 11 (дополнительный код) и вычитание заменяется сложением. Для доказательства этого приведем следующие преобразования:

При этом имеется в виду, что Bi-1=0,b1b2...bi-1, a Bi=0,b1b2...bi-10.

Таким образом, если Ri < 0, то в следующем такте вычитание заменяется сложением, в i-й разряд результата записывается 0, и в следующем такте к Bi приписывается справа не 01, а 11.

Таким образом сразу получается правильный остаток Ri-1, операция вычисления корня квадратного становится регулярной и подобной операции деления без восстановления остатка.

Вычисление корня квадратного подобно вычислению частного при делении. Роль делителя, постоянного в процессе деления, выполняет "переменный делитель" Bi, который сдвигается на один разряд вправо в каждом такте.

Как и при делении, вместо сдвига делителя вправо можно сдвигать остаток влево, предусмотрев использование модифицированного кода остатка из-за возможной потери знака при сдвиге влево.

Результат вычисления корня квадратного всегда получается с недостатком, поэтому желательно его округление. Для этого необходимо определить n+1 разряд корня.

Пример. Вычислить значение корня квадратного из числа 0,101112,, используя ДСДК и сдвиг текущего остатка без восстановления остатка.

ª Примем значение двоичного числа, из которого надо извлечь корень квадратный, равным 0,101112. Для выполнения операции потребуются следующие структурные элементы:

· Сумматор модифицированного кода на 8 разрядов (один дополнительный разряд для образования модифицированного кода, второй - для определения младшего разряда результата.

· Регистр А (РгА) для приема операнда из памяти.

· Регистр В (РгВ) для хранения результатов вычисления значения корня квадратного.

· Регистры D1, D2 (РгD1, РгD2) - вспомогательные регистры для хранения двух бит, приписываемых в конец переменного делителя в соответствии с приведенными выше формулами.

· Регистр С (РгС) для хранения переменного делителя.

· Два счетчика для подсчета числа определенных цифр результата и числа сдвигов вспомогательных регистров.

· Инвертор для реализации сложения (вычитания) переменного делителя с содержимым сумматора.

При выполнении примера полагаем, что в начале выполнения операции текущий остаток равен содержимому РгА. Пример выполнения операции иллюстрируется Табл. 1.

 

Таблица 1 Пример вычисления значения корня квадратного

СМ РгВ РгС РгD1 РгD2 СТ1
00.00000 + 00.101110 ******** ********      
00.101110     00.010000 00.110000  
+ 11.110000   00.010000      
00,011110 *******1 00,000001 00,001000 00,011000  
00,111100 ******1* 00,100000      
+   00,101000      
11,011000     00,000100 00,001100  
00,010100 ******11 00,000011      
00,101000 *****11* 00,110000      
+   00,110100      
11,001100          
11,110100 *****110 00,000110 00,000010 00,000110  
11,101000 ****110* 00,110000      
+   00,110110      
00,110110          
00,011110 ***1101 00,001101 00,000001 00,000011  
00,111100          
+ **1101* 00,110101      
11,001011          
00,000111 **11011        
           

 

В приведенном примере округление не выполнялось. Как видно из таблицы, процесс вычисления корня квадратного состоит из однотипных циклов, в каждом из которых определяется очередная цифра корня. Значение очередной цифры определяет инверсия знака текущего остатка. При положительном остатке в результат заносится 1, а новое значение формируется путем приписывания к первым записанным цифрам результата пары 01. Если текущий остаток отрицателен, то в качестве очередной цифры результата выбирается 0, а для формирования очередного значения переменного делителя к текущему значению корня приписывается пара 11. Затем процедура повторяется.

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

Перед началом выполнения операции знак операнда и его величина анализируются на равенство 0. При нулевой мантиссе операция не производится, а результату сразу присваивается значение 0. Если знак операнда "-", вырабатывается требование прерывания.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-01-30 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: