Реферат Курсовая Конспект
МАШИННІ КОДИ. ДОДАВАННЯ ТА ВІДНІМАННЯ ДРОБОВИХ ДВІЙКОВИХ ЧИСЕЛ У ФОРМАТІ З ПЛАВАЮЧОЮ КОМОЮ - раздел Геология, Лабораторна Робота 4 ...
|
Лабораторна робота 4
МАШИННІ КОДИ. ДОДАВАННЯ ТА ВІДНІМАННЯ ДРОБОВИХ ДВІЙКОВИХ ЧИСЕЛ У ФОРМАТІ З ПЛАВАЮЧОЮ КОМОЮ
Мета роботи
У результаті виконання лабораторної роботи:
· вміти використовувати зображення двійкових чисел у форматі з плаваючою комою;
· набути практичних навичкок під час виконання операцій додавання та віднімання двійкових чисел у форматі з плаваючою комою.
Отримані двійкові числа A2 і B2 подані у форматі з плаваючою комою в прямому (ПК) коді – будемо мати [A] пк і [B]пк. Вирівняти порядки і отримати зворотний (ЗК) і додатковий (ДК) коди – будемо мати відповідно [A]зк, [B]зк, [A] дк і [B]дк. Прямий, зворотний і додатковий коди отримати для +A10 і –A10, а також для +B10 і –B10.
4.3.3. Виконати вручну додавання (віднімання) мантис двійкових чисел [A] дк і [B]дк в додатковому модифікованому коді. Додавання виконати для різних комбінацій знаків чисел [A] дк і [B]дк, а саме для (+,+), (+,–), (–,–) і (–,+).
4.3.4.Виконавши нормалізацію мантиси результату додавання, коли в цьому є необхідність, відтворити результат додавання в ДК, ЗК і ПК, а також у двійковому з фіксованою комою і десятковому кодах.
4.3.5. Для всіх комбінацій значень знаків у A10 і B10 отримати результати додавання (віднімання) цих чисел шляхом запускання демонстраційної програми. Порівняти результати роботи демонстраційної програми з результатами, отриманими вручну.
4.3.6. При незбігу результатів, отриманих у пп.4.3.3 і 4.3.4, з результатами, отриманими в п.4.3.5, знайти і усунути помилки у власних розрахунках.
Хід отримання результатів
Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності до п.4.4.
4.5.1. Спочатку треба вручну отримати результати для свого індивідуального завдання, як зроблено в прикладі із п.4.4.2.
Але в демонстраційній програмі реалізоване дещо інше зображення двійкових чисел у форматі з плаваючою комою, а саме в 3‑байтовому полі (зліва направо):
– в старшому біті знак мантиси, тобто числа;
– в 7-ми наступних бітах – порядок (без знака);
– після крапки, яка відділяє на екрані порядок від мантиси, нормалізоване зображення мантиси (в двох байтах).
Тому виконання індивідуального завдання у відповідності до п.4.4.2 має бути орієнтоване на подальше використання демонстраційної програми.
4.5.2. Перевірити правильність отриманих в п.4.5.1 результатів за допомогою демонстраційної програми, текст якої розміщений нижче.
4.5.3. Демонстраційну програму треба запустити на виконання в одному з середовищ, яке підтримує програмування на мові Pascal.
4.5.4. Текст демонстраційної програми.
{сложение чисел в формате с плавающей точкой}
program plavaush;
uses crt;
var r:real; {результат сложения}
i,a_h,b_h,c_h:shortint; {-128..+127}
{а_h,b_h,c_h порядок двоичной записи чисел a, b, c}
a_l,b_l,c_l:word; {a_l,b_l,c_l мантисса двоичной записи}
p_b,p_a,t:byte; {p_b,p_a порядок чисел b и a}
f:boolean;
d:char;
Procedure shr_ab(var a:shortint;var b:word);
{линейный сдвиг вправо двоичной записи}
begin
for i:=1 to 15 do {shr b}
if (((1 shl i) and b)<>0) and (((1 shl (i-1)) and b)=0)
then b:=b+(1 shl (i-1)) else
if (((1 shl i) and b)=0) and (((1 shl (i-1)) and b)<>0)
then b:=b-(1 shl (i-1));
if ((1 shl 15) and b)<>0 then b:=b-(1 shl 15);
if odd(a) then b:=b+trunc(exp(15*ln(2)));
for i:=1 to 6 do {sar a}
if (((1 shl i) and a)<>0) and (((1 shl (i-1)) and a)=0)
then a:=a+(1 shl (i-1)) else
if (((1 shl i) and a)=0) and (((1 shl (i-1)) and a)<>0)
then a:=a-(1 shl (i-1));
if ((1 shl 6) and a)<>0 then a:=a-(1 shl 6);
end;
Procedure Write_ab(a:shortint;b:word);
{вывод на экран двоичной записи}
begin
for i:=7 downto 0 do
write(ord(((1 shl i) and a)<>0):2);
write('.');
for i:=15 downto 0 do
write(ord(((1 shl i) and b)<>0):2);
Writeln(' ');
end;
BEGIN
while true do
begin
clrscr;
textcolor(13);
writeln('Замечания:');
writeln('# Оба исходных числа вводите в формате: цц.цц / +цц.цц / -цц.цц');
writeln('# После ввода каждого исходного числа нажимайте Enter');
writeln('# На экране - слева направо:');
writeln(' - в старшем бите знак мантиссы, т.е. числа');
writeln(' - в 7-ми следующих битах - порядок без знака');
writeln(' - в двух байтах, после разделяющей точки - ');
writeln(' нормализованное представление мантиссы');
writeln;
textcolor(15);
{Ввод числа А}
Write('Введите число A = ');
Read(r);
{Перевод в форму с фиксированной точкой}
a_h:=abs(trunc(r));
if r<0 then a_h:=a_h + trunc(exp(7*ln(2)));
r:=frac(r);
i:=15;
while (r<>0) and (i<>0) do
begin
r:=r*2;
if trunc(r) <>0 then a_l:=a_l + trunc(exp(i*ln(2)));
dec(i);
r:=frac(r);
end;
{Ввод числа B}
Write('Введите число B = ');
Read(r);
{Перевод в форму с фиксированной точкой}
b_h:=abs(trunc(r));
if r<0 then b_h:=b_h+trunc(exp(7*ln(2)));
r:=frac(r);
i:=15;
while (r<>0) and (i<>0) do
begin
r:=r*2;
if trunc(r) <>0 then b_l:=b_l+trunc(exp(i*ln(2)));
dec(i);
r:=frac(r);
end;
for i:=6 downto 0 do {нахождение порядка числа А}
if ord((1 shl i) and a_h)<>0 then begin p_a:=i+1; break; end;
{Перевод в формат с плавающей точкой}
t:=p_a;
while t<>0 do begin shr_ab(a_h,a_l); dec(t); end;
for i:=6 downto 0 do {нахождение порядка числа В}
if ord((1 shl i) and b_h)<>0 then begin p_b:=i+1; break; end;
{Перевод в формат с плавающей точкой}
t:=p_b;
while t<>0 do begin shr_ab(b_h,b_l); dec(t); end;
{указать порядок числа}
a_h:=a_h+p_a;
b_h:=b_h+p_b;
Write(#10#13,'A[пк]=');
Write_ab(a_h,a_l);
Write('B[пк]=');
Write_ab(b_h,b_l);
{Выравнивание порядков чисел}
if p_a>p_b then begin
t:=p_a-p_b;
while t<>0 do
begin
for i:=1 to 15 do {shr b_l}
if (((1 shl i) and b_l)<>0) and (((1 shl (i-1)) and b_l)=0)
then b_l:=b_l+(1 shl (i-1)) else
if (((1 shl i) and b_l)=0) and (((1 shl (i-1)) and b_l)<>0)
then b_l:=b_l-(1 shl (i-1));
if ((1 shl 15) and b_l)<>0 then b_l:=b_l-(1 shl 15);
inc(b_h);dec(t);
end;
Write(' Выравнивание порядков.');
end
else if p_a<p_b then begin
t:=p_b-p_a;
while t<>0 do
begin
for i:=1 to 15 do {shr a_l}
if (((1 shl i) and a_l)<>0) and (((1 shl (i-1)) and a_l)=0)
then a_l:=a_l+(1 shl (i-1)) else
if (((1 shl i) and a_l)=0) and (((1 shl (i-1)) and a_l)<>0)
then a_l:=a_l-(1 shl (i-1));
if ((1 shl 15) and a_l)<>0 then a_l:=a_l-(1 shl 15);
inc(a_h);dec(t);
end;
Write(' Выравнивание порядков.');
end;
{Перевод чисел в обратный код}
if a_h<0 then
for i:=15 downto 0 do
begin {invert a_l}
if ((1 shl i)and a_l)=0 then
a_l:=a_l+(1 shl i) else a_l:=a_l-(1 shl i) ;
end;
if b_h<0 then
for i:=15 downto 0 do
begin {invert b_l}
if ((1 shl i)and b_l)=0 then
b_l:=b_l+(1 shl i) else b_l:=b_l-(1 shl i);
end;
Write(#10#13,'A[ок]=');
Write_ab(a_h,a_l);
Write('B[ок]=');
Write_ab(b_h,b_l);
{Перевод в дополнительный код}
if a_h<0 then inc(a_l);
if b_h<0 then inc(b_l);
Write(#10#13,'A[дк]=');
Write_ab(a_h,a_l);
Write('B[дк]=');
Write_ab(b_h,b_l);
{сдвиг мантиссы на два разряда для работы с модифицированным кодом}
t:=2;
While t<>0 do begin
for i:=1 to 15 do {shr b_l}
if (((1 shl i) and b_l)<>0) and (((1 shl (i-1)) and b_l)=0)
then b_l:=b_l+(1 shl (i-1)) else
if (((1 shl i) and b_l)=0) and (((1 shl (i-1)) and b_l)<>0)
then b_l:=b_l-(1 shl (i-1));
if ((1 shl 15) and b_l)<>0 then b_l:=b_l-(1 shl 15);
for i:=1 to 15 do {shr a_l}
if (((1 shl i) and a_l)<>0) and (((1 shl (i-1)) and a_l)=0)
then a_l:=a_l+(1 shl (i-1)) else
if (((1 shl i) and a_l)=0) and (((1 shl (i-1)) and a_l)<>0)
then a_l:=a_l-(1 shl (i-1));
if ((1 shl 15) and a_l)<>0 then a_l:=a_l-(1 shl 15);
dec(t);
end;
{установить в знаковых разрядах 11, если число отрицательное}
if a_h<0 then a_l:=a_l or (1 shl 15) or (1 shl 14) ;
if b_h<0 then b_l:=b_l or (1 shl 15) or (1 shl 14) ;
{вывод на экран слагаемых}
Write(#10#13,'Aм = ');
for i:=15 downto 0 do begin
if i=13 then Write(' ':2);
write(ord(((1 shl i) and a_l)<>0):2); end;
Write(#10#13,'+':6,#10#13,'Bм = ');
for i:=15 downto 0 do begin
if i=13 then Write(' ':2);
write(ord(((1 shl i) and b_l)<>0):2); end;
for i:= 0 to 15 do {Сложение. f содержит бит переноса}
case ord(((1 shl i) and a_l)<>0)+ord(((1 shl i) and b_l)<>0)+ord(f) of
1:begin
c_l:=c_l or trunc(exp(i*ln(2)));
f:=false;
end;
2:f:=true;
3:begin
c_l:=c_l or trunc(exp(i*ln(2)));
f:=true;
end;
else
f:=false;
end;
c_h:=b_h;
{вывод результата сложения на экран}
if c_h<0 then c_h:=c_h-trunc(exp(7*ln(2)));
Write(#10#13,'Cм = ');
for i:=15 downto 0 do begin
if i=13 then Write(' ':2);
write(ord(((1 shl i) and c_l)<>0):2); end;
{если значения знаковых битов мантиссы не совпадают,
выполняется нормализация мантиссы}
if ord(((1 shl 15) and c_l)<>0) <> ord(((1 shl 14) and c_l)<>0) then begin
for i:=1 to 15 do {sar c_l}
if (((1 shl i) and c_l)<>0) and (((1 shl (i-1)) and c_l)=0)
then c_l:=c_l+(1 shl (i-1)) else
if (((1 shl i) and c_l)=0) and (((1 shl (i-1)) and c_l)<>0)
then c_l:=c_l-(1 shl (i-1));
{if ((1 shl 15) and c_l)<>0 then c_l:=c_l-(1 shl 15);}{????}
inc(c_h);
Write(#10#13' Нормализация мантиссы.');
end;
{если знаковые биты совпадают со старшим битом мантиссы, выполняется
нормализация мантиссы}
if (ord(((1 shl 15) and c_l)<>0)=ord(((1 shl 14) and c_l)<>0)) and
(ord(((1 shl 15) and c_l)<>0)=ord(((1 shl 13) and c_l)<>0)) then
begin
while (ord(((1 shl 15) and c_l)<>0)=ord(((1 shl 14) and c_l)<>0)) and
(ord(((1 shl 15) and c_l)<>0)=ord(((1 shl 13) and c_l)<>0)) do begin
for i:=14 downto 0 do
if (((1 shl i) and c_l)<>0) and (((1 shl (i+1)) and c_l)=0)
then c_l:=c_l+(1 shl (i+1)) else
if (((1 shl i) and c_l)=0) and (((1 shl (i+1)) and c_l)<>0)
then c_l:=c_l-(1 shl (i+1));
if odd(c_l) then dec(c_l);
dec(c_h);
end;
Write(#10#13' Нормализация мантиссы.');
end;
{перенос знака результата сложения в знаковый разряд числа}
if ((1 shl 15) and c_l)<>0 then c_h:=c_h+trunc(exp(7*ln(2)));
t:=2;
While t<>0 do begin
{удаление знаковых разрядов мантиссы}
for i:=14 downto 0 do
if (((1 shl i) and c_l)<>0) and (((1 shl (i+1)) and c_l)=0)
then c_l:=c_l+(1 shl (i+1)) else
if (((1 shl i) and c_l)=0) and (((1 shl (i+1)) and c_l)<>0)
then c_l:=c_l-(1 shl (i+1));
if odd(c_l) then dec(c_l);
dec(t);
end;
Write(#10#13,'C[дк]=');
Write_ab(c_h,c_l);
{Переход к обратному коду}
if c_h<0 then
for i:=15 downto 0 do
begin {invert c_l}
if ((1 shl i)and c_l)=0 then
c_l:=c_l+(1 shl i) else c_l:=c_l-(1 shl i) ;
end;
Write(#10#13,'C[ок]=');
Write_ab(c_h,c_l);
{Переход к прямому коду}
if c_h<0 then begin
f:=false;
b_l:=0;
for i:= 0 to 15 do {Сложение c_l+1. f содержит биты переносов}
case ord(((1 shl i) and c_l)<>0)+ord(((1 shl i) and 1)<>0)+ord(f) of
1:begin
b_l:=b_l or trunc(exp(i*ln(2)));
f:=false;
end;
2:f:=true;
3:begin
b_l:=b_l or trunc(exp(i*ln(2)));
f:=true;
end;
else
f:=false;
end;
c_l:=b_l;
if f then begin {если возникло переполнение, сдвинуть мантиссу и
увеличить порядок на 1}
for i:=1 to 15 do {sar c_l}
if (((1 shl i) and c_l)<>0) and (((1 shl (i-1)) and c_l)=0)
then c_l:=c_l+(1 shl (i-1)) else
if (((1 shl i) and c_l)=0) and (((1 shl (i-1)) and c_l)<>0)
then c_l:=c_l-(1 shl (i-1));
if ((1 shl 15) and c_l)=0 then c_l:=c_l+(1 shl 15); {starshii bit+}
inc(c_h);
end;
end;
Write(#10#13,'C[пк]=');
Write_ab(c_h,c_l);
r:=0; t:=0;
if ((1 shl 7) and c_h)<>0 then begin
c_h:=c_h-trunc(exp(7*ln(2))); {знак}
t:=1; end;
{Перевод в десятичную систему счисления}
for i:=0+abs(c_h) downto -15+abs(c_h) do
if ((1 shl (i+15-abs(c_h)) )and c_l)<>0 then
r:=r+exp((i-1)*ln(2));
if t=1 then r := -r;
Write(#10#13,'C= ',r:8:4);
a_l:=0; b_l:=0; c_l:=0;
gotoxy(30,35);
textcolor(15);
writeln('Нажмите: Enter - чтобы продолжить и ');
write(' 1 - чтобы выйти');
d:=readkey;
if (d='1') then halt;
end;
END.
– Конец работы –
Используемые теги: машинні, коди, Додавання, віднімання, дробових, двійкових, чисел, форматі, плаваючою, комою0.13
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: МАШИННІ КОДИ. ДОДАВАННЯ ТА ВІДНІМАННЯ ДРОБОВИХ ДВІЙКОВИХ ЧИСЕЛ У ФОРМАТІ З ПЛАВАЮЧОЮ КОМОЮ
Если этот материал оказался полезным для Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов