КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |