Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Метод деления дробных




Беззнаковое деление

Семантика

Умножение знаковое в С51

Test на семантику операции умножения и знак порта

#include <reg51.h> //заголовочный файл с адресами SFR-регистров

char x=0x80; // <0

unsigned z=0x80; //>0

int y;

main()

{

y=x*P1; //y=0xС00 <0 P1=0x80 >0 и char x<0

y=z*P1; //y=0x4000 >0 P1=0x80 >0 и unsigned char z>0

}

Произведение s=x*y

 

1) x>0, y>0 s= x*y

2) x<o,y<0 s=(1-x)(1-y)=1-x-y+xy -требуется коррекция +x+y

 

преобразование сомножителей

(1-x)=(1-1.x)

(1-y)=(1-1.y)

(1-1.x) (1-1.y)= 1-x-y +(1+x)(1+y)=1-x-y+1+x+y+xy=xy

2 – за пределами формата

3) x<o,y>0 s=(1-x)y= y-xy требуется коррекция –y

(1-1.x)y = y –y –xy =1-xy

 

 

4) y<o,x>0 s=(1-y)x= x-xy коррекция –x

(1-1.y)x = x –x –xy =1-xy

 

8*8 в доп.кодах выполняется после преобразования сомножителей

как 16*16à16

 

int y=x*P1; //v<0, x<0. P1>0

в Реассемблере

 

MOV R5, P1(0x90);ввод беззнакового P1и выравнивание форматов 16*16-->16

MOV R4,#0x00; R4.R5= 0.P1

MOV R7,x; преобразование x в R6.R7

 

MOV A,R7

RLC A

SUBB A,ACC; преобразование к специальному формату (-)множимого x

MOV R6,A

LCALL C?IMUL;стандартная подпрограмма беззнакового умножения

; r4r5 * r6.r7 à r6.r7

MOV y(0x0B),R6

MOV 0x0C,R7 //произведение а рабочих регистрах R6.R7

 

Прямое деление целых чисел затруднительно, так как требуется нормализация – приведение делителя к делимому, где делимое меньше делителя. Нормализация, естественно, предполагается при выполнении деления с дробными, где для обратной к умножению операции деления должно соблюдаться всегда условие произведение(делимое) меньше сомножителя (делителя). Если умножение выполняется по методу умножения дробных чисел, то естественно и деление рассматривать как обратное действие для дробных чисел.

 

Если произведение S=A*B дробное, то частное B=S/A дробное при условии, что S<A (правило деления в арифметике дробных чисел).

Если на последнем шаге вычисления (формула 2.1) дробного произведения получим

S=A*B=Sn=2-1(Sn-1+Ab1), то b1 =1 при условии, что Sn-1 = 2Sn-A >=0, иначе b1 =0. и так далее на каждом шаге bi =1, если Sn-i = 2Sn-i-1-A >=0, иначе bi =0.

Изменяя нумерацию остатков при выполнении условия S<A, приходим к следующей рекуррентной формуле деления

 

(2.6) Si+1= 2Si-A и bi=1, если 2Si-A >=0, где S0=S-делимое

Si+1= 2Si и bi=0, если 2Si-A <0

 

В схеме вычислений на Си форматы операндов выровнены для выполнения вычитания.

 

 

 
 

 

 


Рис.2.5. Схема деления в Си без восстановления остатка.

 

Регистр S.B совмещает младшие разряды делимого при сдвиге и разряды частного.

В программе на языке С необходимо контролировать знак остатка в явном виде, при этом сужается диапазон значений делимого и делителя.для беззнаковых(положительных) чисел.

 

Main()

{ Int S=P1<<8;

Int A=P2<<8;

For (char i=0; i<8; i++;)

P3=S= ((S<<1)-A)>=0)? (S<<1)-A +1: S<<1;

}

 

В Ассемблере можно контролировать как бит признака С, так и старшие биты операндов, что позволяет работать без знаков в полных форматах (n-разрядный делитель и 2n-разрядное делимое) значений операндов.

Отрицательный остаток не сохраняется

 

 
 


C

 
 


 


 

 

Рис. 2.6. Схема деления в Ассемблере.

 

 

Особенностью целых арифметических операций является абсолютная погрешность, фиксированная единицей, свойственная целым числам, но при сохранении этой точности изменяются диапазоны и форматы данных в процессе вычислений. Таким образом, подразумевается 2n-разрядное произведение n-разрядных целых и делимое при n-разрядном делителе

Знаковые числа преобразуются в прямой код и деление выполняется с модулями – результат преобразуется в знаковое число.

3.2.4. И звлечение квадратного корня

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

 

Формат подкоренного числа 16 бит. Результат занимает 8-разрядный формат

Алгоритм извлечения для дробного двоичного числа 0.B=√0.S0.

Пусть i+1-ое приближенное двоичное значение корня xi+1= xi bi+1 и bi+1 -младшая двоичная цифра в этом приближении, S0-дробное подкоренное значение не равно 0, x0=0-начальное -целое значение дробного корня, bi+1- текущая двоичная цифра корня.

На первом шаге S0>=(x0 +0.b1)2 =(x0 +0.1)2 =x02 +x0+0.01, x1 =0.b1 и b1=1-старшая цифра дробного корня, если

S1=S0-0.01 >=0

Пусть b1=1 и S1>=0, тогда на втором шаге сдвинем остаток S1 на 2 разряда влево и значение корня x1 на один разряд влево – обозначим новое значение этого остатка Q1.S1, где Q1-целая часть и S1-дробная часть и x1= b1.

Предположим x2= b1,b2

Q1.S1>=(x1 + 0.b2)2 = x12 +x1+0.01 и b2=1, если

Q2.S2=4Q1.S1-x1.01=x12 >=0

Пусть b2=1 и Q2.S2>=0, тогда на третьем шаге сдвинем остаток на 2 разряда влево – получим Q3.S3, где Q3-целая часть и S3-дробная часть и корень сдвинем на один разряд влево x2= b1,b2 и получим x3= b1b2,b3

Q3.S3>=(x2 + 0.b3)2 = x22 +x2+0.01 и b3=1, если

Q3.S3=4Q2.S2-x2.01=x22 >=0

Рекуррентные формулы для вычисления корня методом “цифра за цифрой” без восстановления остатка

(2.7) Qi+1.Si+1=4Qi.Si-xi.01=xi2 и bi+1=1, если 4Qi.Si-xi.01 >=0

Qi+1.Si+1=4Qi.Si=xi2 и bi+1=0, если 4Qi.Si-xi.01 <0

 

 


Рис. 2.6. Схема извлечения корня в Ассемблере без восстановления остатка.

Задание:

Разработать и отладить программы в С51 и на Ассемблере а51. Сравнить объем программ. Представить алгоритмы как рекурсивные функции – подготовить программы и сравнить с циклическими.

.




Поделиться с друзьями:


Дата добавления: 2014-12-27; Просмотров: 492; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.