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

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
SM: Практична робота №4 до лекції 4
Практична робота № 4
Внутрішнє представлення дійсних чисел в IBM PC
Мета роботи:
Отримати практичні навики переведення дійсних чисел з десяткової системи числення в двійкову. Оволодіти навиками представлення дійсних чисел засобами мови Асемблер.
Порядок виконання роботи:
Цілочисельні дані мають бути представлені в усіх можливих для платформи Win32 форматах з урахуванням їх діапазону представлення.
У звіті по лабораторній роботі має бути представлений детальний протокол переведення усіх заданих чисел з 10-ої в 2-ву і 16-ву системи числення.
Варіанти
До заданих двох базових чисел X= ± 60 (ціла частина) і Y=4567 (дробова частина) , потрібно додати і відняти № свого варіанту (для цілої і дробової частини окремо).
Наприклад, № = 45.
№ п\п |
Базове число |
Ціла частина |
Дробова частина |
Числа варіанту |
1 |
60.4567 |
60+45 =105 |
4567+45=4612 |
105.4612 |
2 |
60.4567 |
60-45 =15 |
4567-45=4522 |
15.4522 |
3 |
-60.4567 |
-60+45 =-15 |
-4567+45=-4522 |
-15.4522 |
4 |
-60.4567 |
-60-45 =-105 |
-4567-45=-4612 |
-105.4612 |
Теоретична частина.
Переведення правильних десяткових дробів в двійкову систему числення
Для переведення правильного дробу в двійкову систему мантису (дробова частина числа) послідовно множити на 2 до тих пір, поки в мантисі не вийде або чистий нуль, або потрібна кількість розрядів.
Приклад 1. 0.5d = 0.1b
0.5
х 2
1 . 0
Приклад 2. 0.703125d = 0.101101b
х |
0.703125 |
Після того, як отримали нульову мантису, послідовно зверху вниз збираємо усі цілі частини дробу
|
2 |
||
1 |
. 406250 |
|
X |
2 |
|
0 |
. 812500 |
|
X |
2 |
|
1 |
. 625000 |
|
X |
2 |
|
1 |
. 250000 |
|
X |
2 |
|
0 |
. 500000 |
|
X |
2 |
|
1 |
. 000000 000000 |
Приклад 3. 0.05d - 0.000011(0011)b
х |
0.05 |
Тут виходить двійковий періодичний дріб.
|
2 |
||
0 |
.10 |
|
X |
2 |
|
0 |
.20 |
|
X |
2 |
|
0 |
.40 |
|
X |
2 |
|
0 |
.80 |
|
X |
2 |
|
1 |
.60 |
|
X |
2 |
|
1 |
. 20 |
|
4 |
Таким чином, дійсні числа в загальному випадку неможливо точно представити в памяті ЕОМ.
Переведення змішаних десяткових чисел в двійкову систему числення
Окремо переводяттся ціла і дробова частин.
Приклад 117.25d = 1110101.01b
Переведення десяткових чисел в шістнадцяткову систему числення
Приклад 1. 137d = 89h
137d = 1000 1001b
8 9 h
Приклад 2. 0.5d = 0.8 h
0.5d = 0.1b = 0.1000b
0. 8 h
Приклад 3. 0.703125d - 0.B4h
0.703125d = 0.101101b = 0.1011 0100b
0. B 4 h
В наступних прикладах треба зробити розширення до двійкової тетради:
Приклад4. 0.05d = 0.0C(C) h
0.05d =0.000011(001l) b = 0.0000 1100 1100(1100) b
0. 0 С С (C) h
Приклад 5. 117.25d - 75.4h
117.25d = 111 0l0l.0lb = 0lll 0l0l.0100 b
7 5. 4 h
Переведення двійкових чисел в десяткову систему числення
Приклад. 1110101.01b = 117.25d
позиція |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
-1 |
-2 |
|
число |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
. |
0 |
1 |
1*26 + 1*25 + 1*24 + 0*23 + 1*22 + 0*21 + 1*20 + 0*2-1 + 1*2-2 =
64+32+16+4+1+0,25=117.25
Внутрішнє представлення дійсних чисел.
Дійсні базові величини можуть бути типу float, double або long double Від платформи вони не залежать оскільки їх обробляє співпроцесор.
Через обмежену кількість розрядів, які використовуються для зберігання значення мантиси, неможливе точно представити значення дійсного числа.
Для того, щоб з максимальною точністю зберегти в пам'яті двійкове число з плаваючою комою, його мантиса має бути нормалізована.
Процес нормалізації двійкового числа нічим не відрізняється від нормалізації десяткового дійсного числа. Наприклад, десяткове число 1234,567 в нормалізованому внде виглядає так:
l, 234567 x 103
Число має відємний знак, його мантиса дорівнює 1,1234567, а показник ступені дорівнює 3.
Десяткова кома переноситься вліво або вправо так, щоб перед нею знаходилася тільки одна десяткова цифра. При цьому значення показника ступені визначає кількість цифр, на які треба перемістити десяткову кому вліво (при додатному значенні ) або вправо (при його відємному значенні).
Нормалізація двійкового числа виконується по аналогії з десятковим.
Двійкове число повинне завжди починатися з одиниці і мати наступний вигляд:
± 1.m*2р
де m нормалізована мантиса числа, р - порядок двійкового числа.
Прилади. Представити числа в нормалізованому виді.
± 1d ± 1b ± 1*20
± 0.5d ± 0.1b ± 1.0*2-1
± 0.703125d ± 0.101101b ± 1.01101b*2-1
± 0.05d ± 0.000011(0011) b ± 1.1(0011)b *2-5
± 117.25d ± 1110101.01b ± 1.11010101b*26
Щоб забезпечити нормалізацію, десяткова точка "плаває". То йде вліво і порядок отримує знак плюс, то - вправо, тоді у порядку знак мінус. Звідси і термін - плаваюча точка (floating point).
Внутрішнє (машинне) представлення дійсних чисел :
Знак числа |
Характеристика |
Нормалізована мантиса |
Наприклад, для 32-розрядного числа
Знак числа |
Характеристика |
Нормалізована мантиса |
1 біт |
8 біт |
23 біта |
Знак числа: 0 - плюс, 1- мінус.
Характеристика.
Характеристика = Зміщення ± Показник ступені (Порядок)
При представленні числа в комп'ютері до реального показника ступені додається число 127, тобто число, що дорівнює половині максимально можливого, яке може поміститися в полі характеристика.
Приклади:
Десяткове значення (Е) |
Скоректоване значення (Е+127) |
+5 |
132 |
0 |
127 |
-10 |
117 |
+128 |
255 |
-127 |
0 |
-1 |
126 |
Характеристика |
0 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
255 |
||
Показник ступені |
-127 |
... |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
... |
128 |
Таким чином економляться місце і час, оскільки не треба виділяти розряд для знаку порядку і робити додатковий код для відємних порядків.
Машинні формати дійсних чисел
S |
Характеристика |
Нормалізована мантиса |
|||||
31 |
30 |
… |
23 |
22 |
… |
1 |
0 |
1 біт |
8 біт |
23 біта |
Оскільки двійкове число у нас завжди нормалізоване (1 цифра завжди одиниця), то її зберігати необов'язково. Комп'ютер сам її відновлює. Таке представлення дозволяє вірно відображувати 7-8 десяткових цифр, а його діапазон представлення складає десь 1.5 * 10- 45 . 3.4 * 1038 . Точно вичислити допустимий діапазон для дійсних чисел дуже непросте завдання (особливо для дуже малих чисел).
Приклад 1. ± l.0d = ± 1.0*20
Характеристика = 7F + 0 = 7F = 0111 11112
Число 1.0 додатнє, тому 31 біт дорівнює 0.
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
… |
0 |
0 |
3 |
F |
8 |
0 |
- l.0d = ± 1.0*20
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
… |
0 |
0 |
B |
F |
8 |
0 |
Приклад 2. 0.5d = ±1.0* 2-1
Характеристика = 7F - 1 = 7Е.
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
… |
0 |
0 |
3 |
F |
0 |
0 |
Приклад 3. 0.703125d = 0,101101b = 1,01101b* 2-1
Характеристика = 7F - 1 = 7Е.
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
0 |
… |
0 |
0 |
3 |
F |
3 |
4 |
0 |
0 |
Приклад 4. -0.05d = - 1.1(0011)* 2-5
Характеристика = 7F - 5 = 7А.
1 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
… |
||
B |
D |
4 |
C |
C |
С |
Приклад 5 117.25d = 1110101.01b = 1.11010101b* 26
Характеристика = 7F + 6 = 85.
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
1 |
… |
||
4 |
2 |
E |
A |
8 |
0 |
S |
Характеристика |
Нормалізована мантиса |
||||||
63 |
62 |
52 |
51 |
50 |
… |
1 |
0 |
|
1 біт |
11 біт |
52 біта |
На характеристику витрачається 11 бітів (розряди 52-62). Максимально можливе число, яке можна розмістити в 11-ти бітах це 111 1111 111 lb. Звідси витікає, що
Зміщення = 011 1111 1111b = 3FFh.
Мантиса теж має прихований розряд. Допустимий діапазон для даних типу double :
1.7 х 10-308 . 1.7 х 10308
Приклад. -0.05d = -1.1(0011)* 2-5 b
Характеристика = 3FF - 5 = 3FA = 11 1111 1010 b.
S |
Характеристика |
Нормалізована мантиса |
||||||||||||||||||||||
63 |
62 |
61 |
60 |
59 |
58 |
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
49 |
47 |
46 |
45 |
44 |
43 |
42 |
41 |
… |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
… |
||
B |
F |
A |
9 |
9 |
… |
S |
Характеристика |
Нормалізована мантиса |
||||||
79 |
78 |
64 |
63 |
62 |
… |
1 |
0 |
|
1 біт |
15 біт |
64 біта |
Цей формат є основним робочим форматом для даних співпроцесора. Тому, щоб не робити додаткових перетворень при обчисленнях, мантиса не має прихованого розряду.
Зміщення = 011 1111 1111 1111b = 3FFFh.
Приклад ± 117.25d = ± 1.11010101 * 26 b
Характеристика = 3FFF + 6 = 4005 = 100 0000 0000 0101 b. (при складанні повна аналогія з десятковою системою числення).
0 |
100 0000 0000 0101 |
1 |
110 1010 1000 0000 ... .0000 |
1.11010101 |
117.25 = 40 05 ЕА 80 00 00 00 00 00 00 h
-117,25 = 1100 0000 0000 0101 1110 1010 1000 0000 .. .0000b
- 117.25= C0 05 EA 80 00 00 00 00 00 00h
Контрольні питання
Приклад розвязання типового варіанту
Варіант № 45.
Базові числа: X = ± 60, Y = ± 4567.
№ п\п |
Базове число |
Ціла частина |
Дробова частина |
Числа варіанту |
1 |
60.4567 |
60+45 =105 |
4567+45=4612 |
105.4612 |
2 |
60.4567 |
60-45 =15 |
4567-45=4522 |
15.4522 |
3 |
-60.4567 |
-60+45 =-15 |
-4567+45=-4522 |
-15.4522 |
4 |
-60.4567 |
-60-45 =-105 |
-4567-45=-4612 |
-105.4612 |
Переведення десяткових чисел в двійкову систему числення
Переведемо окремо цілу і дробову частини числа.
105d = 110 1001b
Тепер переведемо в двійкову систему числення правильний десятковий дріб 0.46126. Для перевірки представлення в 32-х бітовому форматі нам достатньо 24-х біт в мантисі (зробимо із запасом - 26 біт) :
0.4612 = 0.0111 0110 0001 0001 0011 0100 00 b
№ біта |
Біт |
Мантиса (Dec) |
Множник |
0 |
4612 |
2 |
|
1 |
0 |
9224 |
|
2 |
1 |
8448 |
|
3 |
1 |
6896 |
|
4 |
1 |
3792 |
|
5 |
0 |
7584 |
|
6 |
1 |
5168 |
|
7 |
1 |
0336 |
|
8 |
0 |
0672 |
|
9 |
0 |
1344 |
|
10 |
0 |
2688 |
|
11 |
0 |
5376 |
|
12 |
1 |
0752 |
|
13 |
0 |
1504 |
|
14 |
0 |
3008 |
|
IS |
0 |
6016 |
|
16 |
1 |
2032 |
|
17 |
0 |
4064 |
|
18 |
0 |
8128 |
|
19 |
1 |
6256 |
|
20 |
1 |
2512 |
|
21 |
0 |
5024 |
|
22 |
1 |
0048 |
|
23 |
0 |
0096 |
|
24 |
0 |
0192 |
|
25 |
0 |
0384 |
|
26 |
0 |
0768 |
Таким чином: 105.4612 d = 110 1001.0111 0110 0001 0001 0011 0100 00b
Числа 2,3,4 формуються аналогічно.
Отримані дані зведемо в таблицю.
Таблиця двійкового нормалізованого представлення дійсних чисел.
Десяткове дійсне число |
Двійкове дійсне число |
Нормалізоване двійкове дійсне число |
105.4612 |
110 1001.01110110000100010011010000 |
1.1010010111011000010001001101 * 26 |
… |
… |
… |
Внутрішнє представлення дійсних чисел.
Відповідає типу даних float мови програмування С++ .
105.4612 = 1.1010010111011000010001001101 * 26
Характеристика = 7F + 6 =85 h = 1000 0101 b.
0 |
10000101 |
101001011101100001000100110 1000 … 0 0 |
Тепер розпишемо по тетрадах, а потім в НЕХ-коді:
0100 |
0010 |
1101 |
0010 |
1110 |
1100 |
0010 |
0010 |
4 |
2 |
D |
2 |
E |
C |
2 |
2 |
Відповідає типу даних double мови програмування С++ .
105.4612 = 1.1010010111011000010001001101 * 26
Характеристика = 3FF + 6 = 405 h = 100 0000 0101 b.
0 |
100 0000 0101 |
1010 0101 1101 1000 0100 0100 1101 … 0 0 |
Тепер розпишемо по тетрадах, а потім в НЕХ-коді:
0100 |
0000 |
0101 |
1010 |
0101 |
1101 |
1000 |
0100 |
0100 |
1101 |
||||||
4 |
0 |
5 |
A |
5 |
D |
8 |
4 |
4 |
D |
… |
Отримати усі розряди мантиси мі не зможемо, оскільки немає інформації. Таким чином, число 105.4612 представлено нами з втратою точності. Для виходу з ситуації, необхідно точніше перевести мантису числа 0.4612 в двійкову систему числення (множити на число 2 не 26 разів, а, наприклад, 56).
Відповідає типу даних long double мови програмування С++ .
У мантиси числа немає прихованого розряду.
105.4612 = 1.1010010111011000010001001101 * 26
Характеристика = 3FFF + 6 = 4005 h = 100 0000 0000 0101 b.
0 |
100 0000 0000 0101 |
1 |
1010 0101 1101 1000 0100 0100 1101 … 0 0 |
Тепер розпишемо по тетрадах, а потім в НЕХ-коді:
0100 |
0000 |
0000 |
0101 |
1101 |
0010 |
1110 |
1100 |
0010 |
0010 |
0110 |
1000 |
... |
|||
4 |
0 |
0 |
5 |
D |
2 |
E |
C |
2 |
2 |
6 |
8 |
Знову отримати усі розряди мантиси ми не зможемо, оскільки немає інформації. Але і того, що є, цілком достатньо.
Текст програми.
TITLE Модуль Int.asm
.386
.model flat,stdcall
ExitProcess PROTO :DWORD
;--------------------------------------------
.data
; float (DWord)
f DWORD 105.4612
DWORD 105
DWORD 105.
;---------------------------double (QWord)
d QWORD 105.4612
;---------------------------long double (TWord)
t TBYTE 105.4612
;----------------------------------------------
.code
main proc
INVOKE ExitProcess,0
main endp
end main
Лістинг програми.
TITLE Модуль Int.asm
.386
.model flat,stdcall
ExitProcess PROTO :DWORD
;--------------------------------------------
00000000 .data
; float (DWord)
00000000 42D2EC22 f DWORD 105.4612
00000004 00000069 DWORD 105
00000008 42D20000 DWORD 105.
;---------------------------double (QWord)
0000000C d QWORD 105.4612
405A5D844D013A93
;---------------------------long double (TWord)
00000014 t TBYTE 105.4612
4005D2EC226809D49518
;---------------------------------------------
00000000 .code
00000000 main proc
INVOKE ExitProcess,0
00000007 main endp
end main
Аналіз цього файлу показує, що машинний формат дійсних чисел нами був отриманий правильно.
Зверніть увагу на внутрішнє представлення чисел 105 і 105. !!!
PAGE 4
FILENAME \p C:\TEXNICUM_2012\ASM_2012\Lesson_ASM_04_formaty_dannyh_FLOAT_Lec_LAB\Lec\ASM_05_float_LECTURE_ukr1.doc DATE \@ "M/d/yyyy" 11/3/2012