Лабораторная работа: Дослідження виконання арифметичних операцій у форматі з рухомою комою
1. Додавання мантис;
Додавання мантис із вирівненими порядками виконується згідно правил додавання чисел з фіксованою комою. Зазвичай використовується модифікований доповнювальний код. (Пригадайте правила подання від’ємних чисел з використанням доповнювального або оберненого модифікованого коду).
3. Переведення результату додавання мантис у прямий код.
У результаті додавання мантис може виникнути один з трьох випадків:
а). Виникає переповнення розрядної сітки комп’ютера (порушення нормалізації вправо). Ознакою переповнення є невизначенність знакових розрядів, коли результат неможливо віднести ні до додатних, ні до від’ємних чисел (код 01 або 10). У цьому випадку необхідно виконати корекцію результату додавання мантис шляхом його зсуву вправо на один розряд і одночасного збільшення порядку на 1.
Наприклад, після додавання мантис отримуємо число 01,00001. Нормалізуємо його зсувом вправо на один розряд і одночасно збільшуємо порядок на 1. В результаті отримуємо:
(А + В)доп = 00,100001 * 10к+1
Переводимо у прямий код: (А + В)пр = 00,100001 * 10к+1.
Внаслідок корекції результату шляхом зсуву вліво точність його погіршилася.
б). Результат від’ємний. Переведення результату додавання мантис у прямий код віконується шляхом виконання другого доповнення (тобто, виконується інверсія результату і до отриманого коду додається 1 у молодший розряд) або другого обертання (тобто, виконується інверсія результату);
в). Результат додатний. У прямому коді додатний результат залишається без змін;
4. Нормалізація результату.
Виконується тоді, коли після переведення у прямий код у отриманому результаті відбувається порушення нормалізації вправо, тобто з правого боку від коми є один або декілька нулів. Це порушення коректується зсувом мантиси результату вліво і одночасне зменшення порядку на кількість розрядів зсуву мантиси до повної нормалізації мантиси.
1. Остаточний результат додавання двох чисел з рухомою комою: сума мантис – це мантиса результату, порядок результату – вирівняний порядок доданків, із врахуванням всіх проведених корекцій. .
Розглянемо приклади виконання операції додавання двійкових чисел з рухомою комою. Всі арифметичні дії будемо виконувати у модифікованому доповнювальному коді.
Приклад 1: Додати A = - 0,1101 * 10101 i B = + 0,1100 * 10011.
а) Вирівнюємо порядки.. Спочатку, визначаємо арифметичну різницю між порядками, віднімаючи від значення порядку числа А значення порядку числа В. При цьому операцію віднімання замінюємо операцією додавання у доповнювальному модифікованому коді.
рА – рВ = рА + (– рВ) = (pA доп(м) = 00,101) + (pB доп(м) = 11,101) = 00,010 – різниця порядків
Аналіз отриманої різниці:
· знак різниці показує, що порядок числа А більше порядку числа В;
· порядки відрізняються на дві одиниці.
Через те, що рА > pB, зсуваємо мантису числа В вправо на два розряди, тобто
МВ пр= 00,001100 і Впр= 00,001100 * 10101.
Розряди мантиси числа В, які вийшли за межі розрядної сітки процесора, будуть втрачені, що погіршить точність обчислень.
б) Переводимо мантиси обох чисел у модифікований доповнювальний код (в межах 4-х розрядів):
МА пр = 11,1101 МА доп(М) =.11,0011
МВ пр = 00,0011 МВ доп(М) =.00,0011
в) Додаємо модифіковані доповнювальні коди мантис чисел А та В і отримуємо результат у модифікованому доповнювальному коді:
(А + В)доп (М) = 11,0011 + 00,0011 = 11,0110
г) Аналіз результату додавання мантис починається із знакових розрядів. Знакові розряди показують, що переповнення розрядної сітки у нас не виникло. Результат – від'ємний, тому переводимо мантису результату у прямий код шляхом виконання другого доповнення і дописуємо спільний порядок:
(А + В)пр (М) = (11,1001 + 00,0001) * 10 101 = 11,1010 * 10101 - остаточний результат.
При переведенні у прямий код знак результату не міняється.
Подальший аналіз показує, що порушення нормалізації результату вправо немає.
Приклад 2. : Додати двійкові числа: А = + 0,10100 * 10101 та В = - 0,10110 * 10100 .
а) Для вирівнювання порядків доданків необхідно із порядку числа А відняти порядок числа В. Віднімання замінимо додаванням у модифікованому доповняльному коді.
(рА доп(м)= 00,101) + (рВ доп(м) = 11,100) = ,101 – 00,100 = 00,101 + (- 00,100) = 00,101 + (11,011 + 00,001) = 00,101 + 1,100 = 00,001
Через те, що рА > pB на +1, виконуємо зсув мантиси числа В вправо на 1 розряд.
МВ пр = 11,010110 і В = 11,010110 * 10101.
б) Переведемо мантиси доданків у модифікований доповняльний код.
МА пр = 00,10100 МА доп(М) = 00,10100.
МВ пр = 11,010110 МВ доп(М) = 11,101010.
в) Додаємо мантиси чисел А і В у модифікованих доповняльних кодах:
(МА доп(М) = 00,10100) + (МВ доп(М) = 11,10101) = 00,01001
г) Переводимо результат у прямий код (виконуємо друге доповнення). У нашому випадку прямий код суми мантис збігається з доповнювальним кодом суми мантис, тому що результат є число додатне.
(МА + МВ) пр(м) = 00,01001
Як видно, виникло порушення нормалізації вправо, тому що вправо від коми розряд дорівнює 0.
д) Виконуємо нормалізацію результату, тобто зсув мантиси ліворуч на 1 розряд з одночасним відповідним зменшенням порядку:
(А + В)пр = 0,1001 * 10100 – остаточний результат.
2.Хід роботи:
· Розробити алгоритм і написати програму додавання довільних (додатних і від’ємних) двійкових чисел із рухомою комою у модифікованому доповнювальному коді в інструкціях симулятора DeComp. Числа подаються у форматі:
Знак порядку | Знак мантиси | Порядок | Мантиса |
2 розряди | 2 розряди | 4 розряди | 8 розрядів |
У алгоритмі передбачити аналіз отриманого результату на:
· переповнення розрядної сітки (порушення нормалізації вліво);
· наявність порушення нормалізації вправо;
· від'ємний результат
Передбачити відповідні заходи з корекції результату.
Блок-схема написаної програми
Попередньо в такі комірки заношу такі дані:
350 | хххх хххх хххх хххх | Число а |
351 | хххх хххх хххх хххх | Число b |
352 | 1100 0000 0000 0000 | Маска для знаку порядку |
353 | 0000 1111 0000 0000 | Маска для порядку |
354 | 0000 0000 0000 0000 | Порядок числа а |
355 | 0000 0000 0000 0000 | Знак порадка числа а |
356 | 0000 0000 0000 0000 | Порядок числа b |
357 | 0000 0000 0000 0000 | Знак порядку числа b |
358 | 0000 0000 0000 0000 | Порядок зі знаком числа a |
359 | 0000 0000 0000 0000 | Порядок зі знаком числа b |
360 | 0000 0000 0000 0001 | Одиниця для додавання |
361 | 0000 0000 0000 0010 | Нормалізація порядку |
362 | 0011 1100 0000 0000 | Маска для нормалізації інвертації порядка |
363 | 0000 0000 0000 0000 | Мантиса числа a |
364 | 0000 0000 0000 0000 | Мантиса числа b |
365 | 0000 0000 0000 0000 | Знак мантиси числа a |
366 | 0000 0000 0000 0000 | Знак мантиси числа b |
367 | 0011 0000 0000 0000 | маска для відокремлення знаку мантиси |
368 | 0000 0000 1111 1111 | Маска для відокремлення мантиси |
369 | 0000 0000 0000 0000 | Мантиса зі знаком числа a |
370 | 0000 0000 0000 0000 | Мантиса зі знаком числа a |
371 | 0000 0000 0000 0000 | Різниця порядків |
372 | 0011 1110 0000 0000 | Маска для взяття різниці порядків |
373 | 1011 1111 1111 1111 | Обернена маска для взяття модуля різниці |
374 | 0000 0000 0000 1001 | Нормалізація різниці порядків |
375 | 0000 0000 0000 0101 | Підготовка мантиси |
376 | 0000 0000 0000 0101 | Підготовка мантиси |
377 | 0000 0000 0000 0010 | Нормалізація порядку |
378 | 0000 0000 1111 1111 | Маска для виділення мантиси |
379 | 1000 0000 0000 0000 | Відновлення знаку мантиси |
380 | 0000 0000 0000 0000 | Сума двох чисел |
381 | 0000 0000 0000 0000 | Мантиса результату |
382 | 0000 0000 0000 0000 | Знак мантиси результату |
383 | 0000 0000 0000 0000 | Порядок результату |
384 | 0000 0000 0000 0000 | Знак порядоку результату |
385 | 0011 1111 1110 0000 | Маска для вибору мантиси результату |
386 | 0000 0000 0000 0110 | Зсув мантиси до молодших розрядів |
387 | 0000 0000 0000 0000 | Результат (Зн. П, Зн.М, Порядок, Мантиса) |
388 | 0000 0100 0000 0000 | Додавання одиниці для переведення порядку |
389 | 0000 0010 0000 0000 | Одиниця для переведення різниці порядків |
390 | 0000 0000 0010 0000 | Додавання одиниці для переведення мантиси |
Код програми: