Машинная арифметика

advertisement
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
1
Элективный курс
для предпрофильной подготовки девятиклассников
«Машинная арифметика»
Лапшева Елена Евгеньевна,
главный методист кафедры
информатики СарИПКиПРО
Пояснительная записка
Творческое название: Как считает компьютер?
Количество часов на курс: 12.
Образовательная
область:
информатика
и
информационно-
коммуникационные технологии.
Тип курса: Предметно-ориентированный (пробный) курс.
Цель курса: научить учащихся проводить арифметические операции над
двоичными числами по алгоритмам машинной арифметики, ориентировать на
специфику обучения профильной информатике в 10-11 классах.
Данная программа адресована для проведения элективного предметноориентированного
курса
в
рамках
предпрофильной
подготовки
девятиклассников общеобразовательных школ. Программа основывается на
базовом курсе информатики 8-9 классов. Основная идея программы – дать
ученику возможность
информатики,
реализовать
уточнить
готовность
свой
интерес
к
и
способность
научным
ученика
основам
осваивать
выбранный предмет на повышенном уровне, создать условия для подготовки к
экзаменам по выбору по предмету «Информатика и ИКТ».
Курс посвящен вопросу хранения числовых данных в памяти компьютера и
реализации арифметических данных над ними. Освоение данного курса
поможет лучше понять:
 принципы
организации
различных
типов
данных
в
языках
программирования;
 ограничения, накладываемые на различные типы данных;
 операции, разрешенные над различными типами числовых данных.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
Состав
учебно-методического
комплекта.
2
Учебно-методический
комплект по элективному курсу для предпрофильной подготовки «Машинная
арифметика» включает в себя учебное пособие, включающее в себя
теоретический материал и набор заданий для самостоятельной работы
школьников, а также набор презентаций для проведения лекционных занятий и
дополнительную литературу на лазерном носителе.
Учебно-методический комплект содержит большое количество заданий
разного уровня сложности. Это позволит учителю построить для каждого
учащегося индивидуальную образовательную траекторию. Задания встроены в
учебное пособие таким образом, чтобы учителю, проводящему данный курс,
было удобнее ориентироваться в последовательности работы с этими
заданиями. Некоторые задания (кроме творческих) снабжены подробными
решениями и ответами.
Текущий контроль уровня усвоения материала осуществляется по
результатам выполнения учащимися практических и творческих заданий.
Итоговый контроль реализуется в форме отчета учащегося по результатам
выполнения последнего творческого задания.
Организация учебного процесса будет реализована в урочной форме, при
которой учитель объясняет новый материал и консультирует учащихся в
процессе выполнения ими практических заданий. Некоторые практические
работы могут быть реализованы в виде компьютерного эксперимента. Для их
проведения требуется язык программирования Паскаль (Borland Pascal 7.0 и его
описание есть на прилагаемом диске).
Программа курса
1.
Десятичная, двоичная и шестнадцатеричная системы счисления.
Переводы целых и вещественных чисел из одной системы счисления
в другую. Взаимосвязь двоичной и шестнадцатеричной систем
счисления. Двоичная арифметика. (4 часа)
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
2.
3
Представление целых чисел в памяти компьютера. Дополнительный
код. Машинная арифметика целых чисел. Понятие переполнения
(выхода за разрядную сетку). (4 часа)
3.
Представление
вещественных
чисел
в
памяти
компьютера.
Нормализация чисел. Мантисса, порядок, смещение порядка.
Арифметика чисел с плавающей запятой. (4 часа)
Примечание. Для эффективного изучения машинной арифметики школьникам
необходимо знать основы теории систем счисления, а именно правила
перевода действительных чисел из одной системы счисления в другую,
двоичную
арифметику
(все
арифметические
операции),
правила
косвенного перевода из одной системы счисления в другую. Данная тема
входит в базовый курс информатики недостаточно полно. Если учащиеся
9-го класса достаточно хорошо ориентируются в теории систем счисления,
то эту тему можно опустить и дать больше времени на практическую
работу на компьютерах для выполнения творческих заданий.
Требования к знаниям и умениям учащихся
После изучения курса учащиеся должны уметь:
 производить операции сложения, вычитания, умножения и деления в
двоичной системе счисления;
 переводить целые числа в знаковый и беззнаковый формат и обратно,
производить над ними арифметические операции по машинному
алгоритму;
 переводить вещественные числа в формат с плавающей запятой и
обратно, производить над ними операции по машинному алгоритму.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
Тематическое планирование курса
№
Тема
1.
Десятичная, двоичная и
4
Теория
Практика
1
1
1
1
1
1
1
1
1
1
шестнадцатеричная системы
счисления. Переводы целых и
вещественных чисел из одной
системы счисления в другую.
2.
Взаимосвязь двоичной и
шестнадцатеричной систем
счисления. Двоичная
арифметика.
3.
Представление целых чисел в
памяти компьютера.
Дополнительный код.
Машинная операция сложения.
Понятие переполнения (выхода
за разрядную сетку).
4.
Машинные операции
умножения, делания нацело и
поиска остатка от деления для
целых чисел.
5.
Представление вещественных
чисел в памяти компьютера.
Нормализация чисел. Мантисса,
порядок, смещение порядка.
Арифметика чисел с плавающей
запятой.
6.
Самостоятельная работа
2
Итого:
5
7
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
5
ТЕОРИЯ СИСТЕМ СЧИСЛЕНИЯ
Понятие числа – фундаментальное понятие, как математики, так и информатики.
Под числом мы будем понимать его величину, а не его символьную запись.
Символы, при помощи которых записывается число, называются цифрами.
Под системой счисления принято называть совокупность приемов обозначения (записи) чисел.
Позиционный принцип в системе счисления
Позиционной системой счисления называется система счисления, в которой значение каждой
цифры в изображении числа зависит от ее положения в ряду других цифр, изображающих число.
Базис системы счисления — это последовательность ключевых чисел, каждое из которых задает
значение цифры в ее позиции или «вес» каждого разряда.
Выбирая за основание системы счисления любое натуральное число k, то есть, считая, что k
единиц любого разряда образует одну единицу соседнего более крупного разряда, придем к так
называемой k-ной системе счисления.
Если k<10, то цифры от k до 9 становятся лишними. Если k>10, то для чисел от 10 до k-1
включительно надо придумать специальные значения цифр. Для 16-ричной системы счисления:
1010
—
A16
1110
—
B16
1210
—
C16
1310
—
D16
1410
—
E16
1510
—
F16
Базис двоичной системы счисления: 1, 2, 4, 8, 16, ..., 2n, ...
Базис восьмеричной системы счисления: 1, 8, 64, 512, ..., 8n, ...
Или в общем виде: q0=1, q1=q, q2=q2, q3=q3, ..., qn=qn, ..., где qN и q1. Число q называют
основанием системы счисления.
Каждое число в любой из таких систем может быть записано в цифровой и многочленной форме:
Цифровая форма: Aq=(anan-1an-2...a2a1a0)q, где ai – цифра в диапазоне от 0 до q-1.
Многочленная форма: Aq=anqn+an-1 qn-1+an-2qn-2+...+a2 q2+a1q1+a0, где q – базис системы
счисления.
Связь между системами счисления
Алгоритм 1. Для того чтобы исходное цело число Aq заменить равным ему целым числом Bp,
необходимо число Aq разделить нацело по правилам q-арифметики на новое основание p. Полученный
результат вновь разделить нацело на основание p и т.д. до тех пор, пока частное не превратиться в
ноль. Цифрами искомого числа Bp являются остатки от деления, выписанные так, чтобы последний
остаток являлся бы цифрой старшего разряда числа Bp.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
6
Число p перед делением должно быть записано в системе с основанием q.
278
278108
8
24
34 8
38
32
27810 = 4268
32 4
2
6
27810 = 1000101102
27810 = 11616
Алгоритм 2. Для того чтобы исходное целое число Aq заменить равным ему целым числом Bp,
достаточно цифру старшего разряда числа Aq умножить по правилам p-арифметики на старое
основание q. К полученному произведению прибавить цифру следующего разряда числа Aq.
Полученную сумму вновь умножить на q по правилам p-арифметики, вновь к полученному
произведению прибавить цифру следующего (более младшего) разряда. Так поступают до тех пор,
пока не будет прибавлена младшая цифра числа Aq. Полученное число и будет искомым числом Bp.
43916 = (4×16+3) ×16+9 = 108110
10111012 = (((((1×2+0) ×2+1) ×2+1) ×2+1) ×2+0) ×2+1 = 9310
6458 = (6×8+4) ×8+5 = 42110
Упражнение 1. Попробуйте сформулировать данный алгоритм (№2) перевода другими словами.
Докажите правильность вашего варианта с помощью математического доказательства.
Упражнение 2. Реализуйте на Паскале алгоритм для перевода целых чисел из десятичной системы
счисления в двоичную (восьмеричную, шестнадцатеричную, любую другую позиционную).
Упражнение 3. Реализация на Паскале алгоритм перевода целых чисел из двоичной
(восьмеричной, шестнадцатеричной, любой) системы счисления в десятичную.
Расчетные примеры
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Десятичная
система
счисления
214
278
263
257
333
307
314
299
317
353
Двоичная
система
счисления
= 11010110
= 100010110
= 100000111
= 100000001
= 101001101
= 100110011
= 100111010
= 100101011
= 100111101
= 101100001
Шестнадцатеричная
система
= D6
= 116
= 107
= 101
= 14D
= 133
= 13A
= 12B
= 13D
= 161
Восьмеричная система
счисления
= 326
= 426
= 407
= 401
= 515
= 463
= 472
= 453
= 475
= 541
11.
12.
13.
14.
15.
16.
17.
18.
19.
269
218
377
443
391
490
241
365
525
= 100001101
= 11011010
= 101111001
= 110111011
= 110000111
= 111101010
= 11110001
= 101101101
= 1000001101
= 10D
= DA
= 179
= 1BB
= 187
= 1EA
= F1
= 16D
= 20D
= 415
= 332
= 571
= 673
= 607
= 752
= 361
= 555
= 1015
Другие
системы
= 1110023
= 24035
= 1211023
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
20.
21.
22.
188
292
159
= 10111100
= 100100100
= 10011111
= BC
= 124
= 9F
7
= 274
= 444
= 237
Алгоритм 3. Для того чтобы исходную правильную дробь 0,Aq заменить равной ей правильной
дробью 0,Bp, нужно 0,Aq умножить на новое основание p по правилам q-арифметики. Целую часть
полученного произведения считать цифрой старшего разряда искомой дроби. Дробную часть
полученного произведения вновь умножить на p, целую часть полученного результата считать
следующей цифрой искомой дроби. Эти операции продолжать до тех пор, пока дробная часть не
окажется равной нулю, либо не будет достигнута требуемая точность.
0,37510 = 0,0112
0,37510 = 0,38
0,37510 = 0,616
0,375×2 = 0,75
0,375×8 = 3,0
0,375×16 = 6,0
0,75×2 = 1,5
0,5×2 = 1,0
Алгоритм 4. Для того чтобы исходную правильную дробь 0,Aq заменить равной ей правильной
дробью 0,Bp, нужно цифру младшего разряда дроби 0,Aq разделить на старое основание q по
правилам p-арифметики. К полученному частному прибавить цифру следующего (более старшего)
разряда и далее поступать также, как и с первой цифрой. Эти операции продолжать до тех пор,
пока не будет прибавлена цифра старшего разряда исходной дроби. После этого полученную сумму
разделить еще раз на q.
0,11012 = (((1:2+0):2+1):2+1):2 = 0,812510
0,458 = (5:8+4):8 = 0,57812510
0,F0316 = ((3:16+0):16+15):16 = 0,938232410
Упражнение 4. Попробуйте сформулировать данный алгоритм (№4) перевода другими словами.
Докажите правильность вашего варианта с помощью математического доказательства.
Упражнение 5. Реализуйте на Паскале алгоритм для перевода правильных дробей из десятичной
системы счисления в двоичную (восьмеричную, шестнадцатеричную, любую другую позиционную).
Упражнение 6. Реализация на Паскале алгоритм перевода правильных дробей из двоичной
(восьмеричной, шестнадцатеричной, любой) системы счисления в десятичную.
Расчетные примеры
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Десятичная
система
счисления
397,25
205,7
184,8
163,15
217,05
208,65
501,7
532,1
492,9
391,15
601,05
337,55
345,35
449,45
700,65
999,75
900,85
Двоичная система
счисления
= 110001101,01
= 11001101,1(0110)
= 10111000,(1100)
= 10100011,001(0011)
= 11011001,00(0011)
= 11010000,10(1001)
= 111110101,1(0110)
= 1000010100,0(0011)
= 111101100,1(1100)
= 11000011,00(1001)
= 1001011001,00(0011)
= 101010001,10(0011)
= 101011001,01010110
= 111000001,01(1100)
= 1010111100,1010(0110)
= 1111100111,11
= 1110000100,11(0110)
Шестнадцате
-ричная
система
= 18D,4
= CD,B(3)
= B8,(C)
= A3,2(6)
= D9,0(C)
= D0,A(6)
= 1F5,B(3)
= 214,1(9)
= 1EC,E(6)
= 187,2(6)
= 259,0(C)
= 151,8(C)
= 159,5(6)
= 1C1,7(3)
= 2BC,A(6)
= 3E7,C
= 384,D(9)
Восьмеричная
система
счисления
= 615,2
= 315,5(4631)
= 270,(6314)
= 243,1(1463)
= 331,0(3146)
= 320,5(1463)
= 765,5(4631)
= 1024,0(6314)
= 754,7(1463)
= 607,1(1463)
= 1131,0(3146)
= 521,4(3146)
= 531,25(4631)
= 701,3(4631)
= 1274,5(1463)
= 1747,6
= 1604,6(6314)
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
304,75
473,6
298,8
285,7
402,5
701,25
613,4
583,3
414,375
170,625
119,75
227,125
93,3125
143,8125
1575,65625
373,5
161,546875
249,75
511,625
117,265625
168,75
1977,84375
62,9375
124,5
266,25
= 100110000,11
= 111011001,(1001)
= 100101010,(1100)
= 100011101,1(0110)
= 110010010,1
= 1010111101,01
= 1001100101,(0110)
= 1001000111,0(1001)
= 110011110,011
= 10101010,101
= 1110111,11
= 11100011,001
= 1011101,0101
= 10001111,1101
= 11000100111,10101
= 101110101,1
= 10100001,100011
= 11111001,11
= 111111111,101
= 1110101,010001
= 10101000,11
= 11110111001,11011
= 111110,1111
= 1111100,1
= 100001010,01
= 130,C
= 1D9,(9)
= 12A,(C)
= 11D,B(3)
= 192,8
= 2BD,4
= 265,(6)
= 247,4(C)
= 19E,6
= AA,A
= 77,C
= E3,2
= 5D,5
= 8F,D
= 627,A8
= 175,8
= A1,8C
= F9,C
= 1FF,A
= 75,42
= A8,C
= 7B9,D8
= 3E,F
= 7C,8
= 10A,4
8
= 460,6
= 731,(4631)
= 452,(6314)
= 435,5(4631)
= 622,4
= 1275,2
= 1145,(3146)
= 1107,2(3146)
= 636,3
= 252,5
= 167,6
= 343,1
= 135,24
= 217,64
= 3047,52
= 565,4
= 241,43
= 371,6
= 777,5
= 165,21
= 250,6
= 3671,66
= 76,74
= 174,4
= 412,2
Взаимосвязь между системами счисления с основаниями «2», «8»
и «16»
Теорема 1. Для записи целого двоичного числа в системе с основанием q=2n достаточно данное
двоичное число разбить на грани справа налево (т.е. от младших разрядов к старшим) по n цифр в
каждой грани. Затем каждую грань следует рассматривать как n-разрядное двоичное число и
записать его как цифру в системе с основанием q=2n.
2-я система
счисления
000
001
010
011
100
101
110
111
8-я система
счисления
0
1
2
3
4
5
6
7
2-я с.с.
0000
0001
0010
0011
0100
0101
0110
0111
16-я с.с.
0
1
2
3
4
5
6
7
2-я с.с.
1000
1001
1010
1011
1100
1101
1110
1111
16-я с.с.
8
9
A
B
C
D
E
F
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
10111101100011128
9
101111011000111216
101
111
101
000
1112
0101
1110
1100
01112
5
7
3
0
78
5
E
C
716
Теорема 2. Для замены целого числа, записанного в системе счисления с основанием p=2n, равным
ему числом в двоичной системе счисления, достаточно каждую цифру данного числа заменить nразрядным двоичным числом.
35478A162
601282
3
5
4
7
8
A16
6
0
1
28
0011
0101
0100
0111
1000
10102
110
000
001
0102
Теорема 3. Для перевода правильных двоичных дробей в систему счисления с основанием q=2n
необходимо данную дробь разбить на грани слева направо от запятой по n цифр в каждой. Затем
каждую грань следует рассматривать как n-разрядное двоичное число и записать его как цифру в
системе счисления с основанием q=2n.
0,11011100128
0,110111001216
0,
110
111
0012
0,
1101
1100
10002
0,
6
7
18
0,
D
C
816
Теорема 4. Для замены правильной дроби, записанной в системе счисления с основанием p=2n,
равной ей дробью в двоичной системе счисления достаточно каждую цифру данной дроби заменить
n-разрядным двоичным числом.
0,A31162
0,70482
0,
A
3
116
0,
7
0
48
0,
1010
0011
00012
0,
111
000
1002
Упражнение 7. Докажите данные теоремы.
Упражнение 8. Реализуйте на Паскале алгоритм для перевода чисел из двоичной системы
счисления в восьмеричную (шестнадцатеричную, четверичную).
Упражнение 9. Реализация на Паскале алгоритм перевода
(шестнадцатеричной, четверичной) системы счисления в двоичную.
чисел
из
восьмеричной
Расчетные примеры
№
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Восьмеричная система
счисления
764,26
532,47
374,062
405,73
271,502
674,55
173,21
247,17
777,1
514,04
105,25
333,33
5015,634
710,16
Двоичная система
счисления
= 111110100,01011
= 101011010,100111
= 11111100,00011001
= 100000101,111011
= 10111001,10100001
= 110111100,101101
= 1111011,010001
= 10100111,001111
= 111111111,001
= 101001100,0001
= 1000101,010101
= 11011011,011011
= 101000001101,1100111
= 111001000,00111
Шестнадцатеричная
система счисления
= 1F4,58
= 15A,9C
= FC,19
= 105,EC
= B9,A1
= 1BC,B4
= 7B,44
= A7,3C
= 1FF,2
= 14C,1
= 45,54
= DB,6C
= A0D,CE
= 1C8,38
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
3504,144
250,456
3161,176
2241,002
2674,74
1042,7
1112,5
3660,25
333,5
421,002
= 11101000100,0011001
= 10101000,10010111
= 11001110001,00111111
= 10010100001,00000001
= 10110111100,1111
= 1000100010,111
= 1001001010,101
= 11110110000,010101
= 11011011,101
= 100010001,00000001
10
= 744,32
= A8,97
= 671,3F
= 4A1,01
= 5BC,F
= 222,E
= 24A,A
= 7B0,54
= DB,A
= 111,01
Двоичная система счисления. Двоичная и шестнадцатеричная
арифметика
Двоичная система счисления является минимальной системой, в которой реализуется принцип
позиционности в цифровой форме записи числа. В двоичной системе счисления значение каждой
цифры по месту при переходе от любого данного разряда к следующему старшему разряду
увеличивается вдвое.
Утверждение двоичной арифметики в качестве общепринятой основы при конструировании ЭВМ
с программным управлением состоялось под влиянием работы А. Беркса, Х. Гольдстайна и Дж. фон
Неймана над проектом первой ЭВМ с хранимой в памяти программой.
Арифметика двоичной системы счисления, как и всякой другой позиционной системы,
основывается на использовании таблиц сложения и умножения цифр.
+
0
1
*
0
1
0
0
1
0
0
0
1
1
11
1
0
1
+101110
+101111,001
×1101
1101
10101,110
11
1110111
1000100,111
+1101
11010
1100111
Упражнение 10. Составьте таблицы сложения и умножения для шестнадцатеричной и
восьмеричной систем счисления.
Расчетные примеры
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
110111,1101+11101,1011=1010101,1
110111,1101-11101,1011=11010,001
1011011×100=101101100
1011011:100=10110,11
11011101,0111+11011001,11011=110110111,01001
110111×11=10100101
11011101,0111-11011001,11011=11,10011
1011101×101=111010001
10001000+1111011=100000011
10001000-1111011=1101
ABC,F+123,4=BE0,3
563,7+ED,4=650,B
111,9+FF,1=210,A
AC7,3-4B8,4=60E,F
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
15.
11
999,9-FF,1=89A,8
Представление и обработка числовой информации
Так как компьютер может различить только нулевое и единичное состояния бита, то он работает в
системе счисления с основанием «2».
Биты 01000001 могут представлять как число 65, так и букву «A». Если программа определяет
элемент данных для арифметических целей, то 01000001 представляет двоичное число,
эквивалентное числу 65. Если программа определяет элемент данных как символ, тогда 01000001
представляет собой букву «A».
Основной особенностью представления чисел в памяти компьютера является то, что, в отличие от
записи числа на бумаге, компьютерные ячейки имеют ограниченный размер и, следовательно,
вынуждают использовать при записи чисел и действиях с ними конечное количество разрядов. Это
приводит к тому, что бесконечное множество чисел заменяется конечным множеством их
представлений. Способы представления и допустимые над ними действия различны для следующих
числовых множеств:

целые положительные числа (целые числа без знака);

целые числа со знаком;

вещественные нормализованные числа.
Рассмотрим подробнее перечисленные группы.
Целые числа
Минимальный объем памяти, выделяемый для хранения целого числа, один байт. Один байт – это
восемь бит, тогда количество различных значений, которые можно уместить в этот объем, равняется
28=256.
Давайте поразмышляем, какие числа мы поместили бы в один байт памяти компьютера?
Рассмотрим все возможные варианты ответов.
От 1 до 256. Удобен ли этот диапазон? Даже если нам никогда не понадобятся отрицательные
числа, то нулевое значение нам нужно будет всегда.
От 0 до 255. Да такой вариант существует. Например, тип byte в Паскале использует этот формат
хранения данных. Это представление называется беззнаковым, и целые числа в памяти компьютера
хранятся в явном виде.
Значение
0
1
2
3
…
255
Представление
00000000
00000001
00000010
00000011
…
11111111
Таб.1
Операция сложения беззнаковых чисел происходит по стандартному алгоритму двоичной
арифметики.
Сложим двоичные числа 65 и 42.
01000001
+
00101010
01101011
65
+
42
107
Очевиден следующий вопрос – что произойдет, если сумма двух 8-рарядных беззнаковых чисел
превысит значение 255? Например, 167+198.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
10100111
+
11000110
1 01101101
12
167
+
198
365
Произошел перенос значащего разряда за разрядную сетку. Следовательно, в разрядной сетке
останется число 01101101, которое интерпретируется компьютером как 109. Если в программе, в
которой происходит данное действие, контролируются подобные ситуации, то появится сообщение
об ошибке. Если такая проверка не производится, то результат вычислений будет неправильным.
Убедимся в этом.
Проведем компьютерный эксперимент. Если при компиляции программы у вас появляется ошибка
Range check error, следовательно, компилятору дается директива отслеживать ошибочные ситуации.
Чтобы убрать проверку, снимите опцию Options – Compiler… – Range checking.
var
a,b,c:byte;{Тип короткое целое без знака}
begin
a:=167;
b:=198;
c:=a+b;
writeln(c);
end.
Действительно, данная программа дает в результате 109.
Упражнение 11. Изучите ключи и директивы компилятора языка Паскаль. Найдите директиву
компилятора, отключающую проверку выхода за разрядную сетку. Ответ: {$Q-}
Помимо однобайтового представления беззнаковых чисел (byte) в языке программирования
Паскаль поддерживается двухбайтовый тип Word.
Знаковое представление целых чисел. Давайте придумаем способ, с помощью которого компьютер
будет отличать положительные числа от отрицательных. Количество различных значений в байте
памяти, как говорилось выше, 28=256. Получается 128 отрицательных значений и 128
положительных. Естественное предположение, что старший бит (под номером 7) отдается на
обозначение знака. Пусть 1 в старшем разряде представляет отрицательное число, а 0 – число
положительное. Тогда:
Значение
…
+2
+1
0
-1
-2
…
Представление
…
00000010
00000001
00000000
10000001
10000010
…
Таб.2
Получаем 127 положительных значений, 127 отрицательных значений и нулевое значение, то есть
255 значений. Потерялось одно значение 10000000.
Если цифровая часть положительных и отрицательных чисел всегда содержит абсолютную
величину числа, то такой способ представления знаковых чисел называют прямым кодом. Обработка
чисел, представленных в прямом коде:

требует отдельных операций над цифровой и знаковой частями,

требует альтернативного выполнения операций сложения и вычитания,

приводит к появлению двух представлений нуля: +0 (00000000) и -0 (10000000).
Наиболее сложной для реализации в данном представлении является операция вычитания.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
13
С этой проблемой столкнулся еще Блез Паскаль в XVII веке при конструировании своей
суммирующей машины. При реализации идеи автоматического переноса десятков Паскаля
остановила определенная трудность: изобретенный им механизм переноса десятков работал при
вращении счетных колес только в одном направлении, а это не позволяло производить вычитание
вращением колес в противоположную сторону. Простой и остроумный выход из этого положения,
найденный Паскалем, был настолько удачен, что используется в современных ЭВМ. Паскаль заменил
вычитание сложением с дополнением вычитаемого.
Для 8-разрядной машины Паскаля, работавшей в десятичной системе счисления, дополнением
числа А будет (100.000.000-А), поэтому операция вычитания В-А может быть заменено сложением
В+(100.000.000-А)=100.000.000+(В-А). Получившееся число будет больше искомой разности на
100.000.000, но так как машина 8-разрядная, то единица в девятом разряде просто пропадает при
переносе десятков из восьмого.
В компьютере происходит все то же, только в двоичной системе счисления.
Дополнением k-разрядного целого числа Z в двоичной системе счисления называется величина
D(Z, k) = 2k – Z (1).
Данную формулу можно представить в ином виде: D(Z, k) = ((2k-1)-Z)+1. Число 2k-1, состоит из k
наибольших в данной системе счисления цифр (в нашем случае одного байта – 11111111). Поэтому
(2k-1)-Z можно получить путем дополнения до 1 каждой цифры числа Z и последующим
прибавлением к последнему разряду 1.
Так как в двоичной системе счисления дополнением 1 является 0, а дополнением 0 является 1,
построение D(Z, k) сводится к инверсии данного числа, т.е. замена нулей единицами и единиц
нулями, и прибавлением 1 к последнему разряду. Другими словами, дополнение двоичного числа
формируется в два этапа:
1. строится инвертированное представление исходного числа;
2. к инвертированному представлению прибавляется 1 по правилам двоичной арифметики.
Дополнительный код двоичных целых чисел строится по следующим правилам:

для Z≥0 дополнительный код совпадает с самим числом;

для Z<0 дополнительный код совпадает с дополнением модуля числа, т.е. D(|Z|, k).
Найдем диапазон знаковых целых чисел, занимающих один байт в памяти компьютера. Будем
строить таблицу от нуля, затем представление +1 и -1, +2 и -2, и т.д.
Значение
+127
+126
…
+2
+1
0
-1
-2
…
-126
-127
-128
Представление
01111111
01111110
…
00000010
00000001
00000000
11111111
11111110
…
10000010
10000001
10000000
Таб.3
После построения такой таблицы становится очевидным, что ось симметрии диапазона проходит
между 0 и -1. Следовательно, диапазон знаковых чисел, занимающих один байт в памяти компьютера
– от -128 до +127. В языке программирования Паскаль этот тип данных обозначается служебным
типом ShortInt (короткое целое).
Упражнение 12. Найдите диапазон знаковых и беззнаковых чисел для области памяти в 2 и 4
байта и поставьте им в соответствие типы данных языка программирования Паскаль. Ответ. Если
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
14
число занимает два байта, то диапазоны следующие: 0...65535 (Word – слово), -32768...32767 (Integer
– целое). Если число занимает четыре байта, то диапазоны следующие: 0..4294967295 (такого типа в
Паскале нет), -2147483648.. 2147483647 (LongInt – длинное целое).
Анализируя полученную выше таблицу значений можно сделать вывод, что отрицательные
двоичные числа содержат единичный бит в старшем разряде.
Число 65:
01000001
Инверсионные биты:
10111110
Плюс 1:
10111111
равно -65
Для определения абсолютного значения отрицательного двоичного числа в машинном
представлении просто повторяют предыдущие операции: инвертируют все биты и прибавляют
единицу.
Двоичное дополнение:
10111111
Инверсионные биты:
01000000
Плюс 1:
01000001
равно +65
Проверим, даст ли сумма +65 и -65 в результате 0:
01000001
+
10111111
1 00000000
65
+
-65
0
Все восемь бит имеют нулевое значение. Единичный бит, вынесенный за разрядную сетку влево,
потерян.
Рассмотрим в общем случае сложение двух знаковых двоичных числа C=A+B
Старший
бит
числа A
Старший Старший
бит числа бит числа
B
С
Перенос
единицы
из разрядной
сетки
0
0
0
Нет
0
0
1
Нет
1
1
1
Есть
1
1
0
Есть
0
1
0
Есть
0
1
1
Нет
Комментарий
Сложение двух положительных чисел без
переполнения. Результат корректен.
Переполнение при сложении двух
положительных чисел. Результат некорректен.
Сложение двух отрицательных чисел без
переполнения. Результат корректен.
Переполнение при сложении двух
отрицательных чисел. Результат некорректен.
Сложение чисел с разными знаками; A>|B|.
Результат корректен.
Сложение чисел с разными знаками; A<|B|.
Результат корректен.
Таб.4
Рассмотрим все подобные случаи на примере.
Убедимся, что результат, получаемый компьютером при сложении положительного и
отрицательного числа, получается корректным.
Вычтем 42 из 65. Найдем дополнительный код числа -42.
Число 42:
00101010
Инверсионные биты:
11010101
Плюс 1:
11010110
Прибавим к +65 -42 по правилам машинной арифметики.
равно -42
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
01000001
+
11010110
1 00010111
15
65
+
-42
23
Результат 23 является корректным.
Упражнение 13. Найти по правилам машинной арифметики сумму +42 и -65.
Решение.
Число 65:
01000001
Инверсионные биты:
10111110
Плюс 1:
10111111
равно -65
Прибавим к -65 +42 по правилам машинной арифметики.
10111111
+
00101010
11101001
+
-65
42
?
Убедимся, что результат корректный. Так как старший седьмой бит результата равен единице, то
это отрицательное число в дополнительном коде. Найдем его абсолютное значение.
Число ?:
11101001
Инверсионные биты:
00010110
Плюс 1:
00010111
равно 23
Следовательно, в результате мы получили число -23, результат корректный.
Упражнение 14. Найти по правилам машинной арифметики сумму -42 и -65.
Решение. Сначала переводим оба числа в дополнительный код. Затем складываем эти числа.
10111111
+
11010110
1 10010101
+
-65
-42
?
При переходе единицы в знаковый разряд и за разрядную сетку не вызывает ошибки. Проверим
полученный результат. Старший бит – 1, следовательно, полученное число отрицательное и
представлено в дополнительном коде.
Число ?:
10010101
Инверсионные биты:
01101010
Плюс 1:
01101011
равно 107
Результат корректный.
Упражнение 15. Найдите результат сложения двух положительных знаковых целых числа: 102 и
54. Проведите вычисления, пользуясь алгоритмом машинной арифметики. Проведите компьютерный
эксперимент. Напишите программу на Паскале, складывающую эти два числа. Сравните результаты,
компьютерные и полученные вручную.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
16
Решение.
01100110
+
00110110
10011100
+
102
54
?
Произошел перенос единичного разряда в знаковый разряд, выноса за разрядную сетку не было,
следовательно, результат будет некорректным. Попробуем его перевести в десятичную систему
счисления. Так как тип данных – знаковый, то единица в старшем разряде говорит нам о том, что
число отрицательное и представлено в дополнительном коде.
Число ?:
10011100
Инверсионные биты:
01100011
Плюс 1:
01100100
равно 100
Следовательно, результат должен интерпретироваться как -100.
Попробуем провести компьютерный эксперимент.
{$Q-}
var
a,b,c:shortint;{Тип короткое целое со знаком}
begin
a:=102;
b:=54;
c:=a+b;
writeln(c);
end.
Действительно, данная программа дает в результате -100.
Упражнение 16. Найдите результат сложения двух отрицательных знаковых целых числа: -98 и 76. Проведите вычисления, пользуясь алгоритмом машинной арифметики. Проведите компьютерный
эксперимент. Напишите программу на Паскале, складывающую эти два числа. Сравните результаты,
компьютерные и полученные вручную. Ответ. 82.
Упражнение 17. Найдите описания всех операций Паскаля, определенных над целыми числами
(целочисленное деление, поиск остатка от деления, сдвиг вправо и влево, побитные операции).
Напишите программы, иллюстрирующие данные операции.
Упражнение 18. Подумайте, какие случаи не рассмотрены в таблице 4 и почему.
Умножение целых чисел
При умножении двух целых беззнаковых числа размером в n бит результат, получаемый
микропроцессором, будет длиной в 2n бит.
Простейший способ умножения целых беззнаковых чисел X×Y=Z есть суммирование множимого X
с накоплением его столько раз, сколько единиц содержит значение множителя Y. Этот способ требует
при больших значениях Y значительных затрат времени на выполнение многократных операций
сложения, и поэтому применение его в компьютерах ограниченно.
Сокращение количества операций сложения при реализации умножения основано на методах
совместного анализа цифр множителя. Эти методы дробят процесс получения произведения на ряд
шагов, связанных с формированием частичных произведений (ЧП) – произведений множимого на
отдельные разряды или группы разрядов множителя – и их суммированием, то есть формированием
суммы частичных произведений (СЧП).
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
17
Методы умножения двоичных беззнаковых чисел основаны на представлении произведения в виде
полинома:
n 1
 n1
 n1
Z  X  Y  X    yi  2i     X  yi   2i  ЧПi  2i ,
i 0
 i 0
 i 0
(2)
где yi  0,1 – двоичные цифры множителя, ЧПi  X  yi – частичные произведения (ЧПi=X, если
yi=1, и ЧПi=0, если yi=0).
Заметим, что умножение ЧПi  0 на степень 2i эквивалентно сдвигу множимого на i разрядов
влево.
Формирование произведения, согласно формуле (2), представляется как последовательность таких
действий:
1. обнуление СЧП;
2. анализ младшего разряда множителя: если y0=1, выполняется сложение ЧП0=X с СЧП и
переход к п.3; если y0=0, сразу переход к п.3;
3. сдвиг множимого влево;
4. анализ очередного разряда множителя: если y1=1, выполняется сложение ЧП1∙21 с СЧП и
переход к п.5; если y1=0, непосредственно переход к п.5;
5. сдвиг множимого влево;
6. анализ очередного y2 разряда множителя и т.д.
После анализа старшего yn-1 разряда множителя осуществляется последнее сложение ЧП n1  2 n1 с
СЧП (если yn-1=1), и процесс прекращается. Результирующая СЧП является искомой. Очевидно, что
неподвижную СЧП и сдвигаемое влево на n-1 разряд множимое необходимо размещать в 2nразрядных форматах, причем операция сложения должна обрабатывать 2n-разрядные данные.
Рассмотрим на примере умножение двух целых беззнаковых чисел. Найдем произведение 45 и 29,
пользуясь машинным алгоритмом. В десятичной системе счисления 45∙29=1305.
Переведем множимое и множитель в двоичную систему счисления: 4510=1011012, 2910=111012.
Шаг i
yi
ЧП
СЧП
0
1
101101
101101
1
0
1011010
101101
2
1
10110100
101101
+10110100
3
1
101101000
101101
+10110100
+101101000
4
1
1011010000
101101
+10110100
+101101000
+1011010000
10100011001
Таб.5
Итак, результат произведения 101000110012=130510. То есть, можно сделать вывод, что алгоритм
работает правильно.
Очевидно, что при работе с однобайтовыми беззнаковыми числами результат таковым не будет.
Так как он занимает 11 разрядов. Можно предположить, что в разрядной сетке результата будет
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
18
00011001, то есть в 2510. Проведем машинный эксперимент. Действительно, при отключенной
проверке выхода результата за разрядную сетку, на экран выводится 25.
Упражнение 19. Напишите программу на Паскале, имитирующую процесс умножения двух
целых беззнаковых чисел.
Решение.
var
temp,k: byte;
a,b,n,res:word;
begin
writeln('Введите два положительных числа a<255, b<255');
readln(a,b);{Ввод множимого и множителя}
res:=0;
{Сумма частичных произведений}
k:=0;
{Счетчик шагов, битов}
n:=1;
{Переменная для вычисления значения очередного бита}
while k<=7 do
{Пока не просмотрены все биты множителя b}
begin
temp:=n and b;
{Находим значение очередного бита}
if temp<>0
{Если он не равен нулю, то вычисляем}
then res:=res+a; {очередное частичное произведение}
a:=a shl 1;
{Сдвигаем множимое на один бит влево}
n:=n*2;
{Будем рассматривать очередной бит}
k:=k+1;
end;
writeln('Произведение a*b=',res);
end.
Методы умножения беззнаковых чисел применимы и для вычисления произведения двоичных
знаковых чисел в дополнительных кодах.
Проведем эксперимент. Попробуем умножить два знаковых целых числа по правилам умножения
беззнаковых целых чисел.
В двоичном
представлении
×
11111111
Беззнаковые
числа
×
255
Знаковые
числа
×
-1
11111111
255
-1
1111111000000001
65025
-511
Можно сделать вывод, что правило умножения для беззнаковых целых чисел не подходит для
знаковых чисел, представленных в дополнительном коде. Следовательно, просто переносить метод
умножения беззнаковых чисел на знаковые нельзя.
Пусть целые двоичные сомножители X и Y представлены в дополнительном коде в n-разрядном
формате, старший разряд которого используется для представления знака. При умножении этих
чисел возможны четыре ситуации:
1. X>0, Y>0. Так как D(X, n)=X и D(Y, n)=Y, то D(X Y, n)=X Y, то есть результат умножения
совпадает с произведением беззнаковых чисел.
2. X<0, Y>0. Согласно формуле (1), D(X<0, n)= 2n+X, и произведение, полученное методом
умножения
беззнаковых
чисел,
псевдопроизведение
–
равно
n
D( X , n)  D(Y , n)  2  Y  X  Y .
Правильный
же
результат
равен
D( X  Y  0, n)  2 2 n  X  Y . Очевидно, что для получения правильного результата из
псевдопроизведения необходимо к последнему прибавить 22n (эту операцию
практически не надо выполнять, так как данное число выходит за рамки формата
произведения) и вычесть множитель Y  2 n , то есть вычесть множитель, сдвинутый
влево на n разрядов.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
19
3. X>0, Y<0. Эта ситуация аналогична предыдущей. Для получения правильного
произведения необходимо вычесть множимое, сдвинутое влево на n разрядов.
4. X<0, Y<0. Так как D(X<0, n)=2n+X и D(Y<0, n)=2n+Y, то псевдопроизведение равно
а
правильное
произведение
D( X , n)  D(Y , n)  2 2 n  2 n  X  2 n  Y  X  Y ,
D( X  Y , n)  X  Y . Следовательно, для получения правильного произведения из
псевдопроизведения необходимо вычесть число 2 n  X  2 n  Y , то есть вычесть и
множитель и множимое, сдвинутые предварительно на n разрядов влево.
Упражнение 20. Приведите примеры для каждого рассмотренного случая.
Решение.
1.
При умножении двух положительных знаковых чисел, алгоритм полностью совпадает с
алгоритмом умножения беззнаковых чисел. См. примеры выше.
2.
Пусть X= -5, а Y=32. Дополнительный код числа X равняется D(X, 8)=11111011,
Y=00100000. Тогда псевдопроизведение равно:
11111011
×
00100000
0001111101100000
-5
×
32
? -160
Найдем реальное произведение, отняв от полученного псевдопроизведения следующую
поправку: Y  28  00100000 2 100000000 2  0010000000000000 2
0001111101100000
0010000000000000
1..1111111101100000
Число 1111111101100000 является дополнительным кодом числа -160. Следовательно,
результат правильный.
3.
Данный случай решается аналогично предыдущему.
4.
Пусть X= -5, а Y= -32.
псевдопроизведение равно:
Тогда
D(X, 8)=11111011,
11111011
×
11100000
1101101110100000
D(Y, 8)=11100000.
Отсюда,
-5
×
-32
? 160
Найдем реальное произведение, отняв от полученного псевдопроизведения следующую
поправку
28  X  28  Y  111110112 100000000 2  11100000 2 100000000 2 
 (111110112  11100000 2 ) 100000000 2  11101101100000000 2
1101101110100000
11101101100000000
1..0000000010100000
Итак, в разрядной сетке осталось число +160. Что и требовалось получить.
Упражнение 21. Придумайте еще один способ перемножения знаковых чисел в дополнительных
кодах. Ответ: перемножение модулей чисел, вычисление знака результата при помощи сравнения
старших разрядов множителей. Если разряды равны, то ответ положительный (представляется в
прямом коде). Если разряды не равны, то ответ отрицательный (представляется в дополнительном
коде).
Упражнение 22. Оцените, какой из предложенных алгоритмов умножения знаковых чисел более
рациональный (быстрый по количеству операций и хранимой информации).
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
20
Над множеством целых чисел со знаком операция деления не определена, поскольку в общем
случае ее результатом будет вещественное число. Однако допустимыми являются операции
целочисленного деления и нахождения остатка от целочисленного деления (те, что в паскале
обозначаются div и mod). Точнее, значения обеих величин находятся одновременно в одной
процедуре, которая в конечном счете сводится к последовательности вычитаний или, еще точнее,
сложений с дополнительным кодом делителя.
Упражнение 23. Напишите программу на Паскале,
целочисленного деления и нахождения остатка от деления.
имитирующую
работу
операций
var
a,b,ost,chast: word;
begin
writeln('Введите делимое и делитель a и b');
readln(a,b);
ost:=a;
{Остаток от деления}
chast:=0;
{Целочисленное частное}
While ost>=b do
{Пока остаток от деления больше делителя}
begin
chast:=chast+1;
{Увеличиваем частное на единицу}
ost:=ost-b;
{От остатка отнимаем делитель}
end;
writeln('Результат целочисленного деления равен',chast);
writeln('Остаток при целочисленном делении равен',ost);
end.
Вещественные числа
Система вещественных чисел, применяемая при ручных вычислениях, предполагается бесконечно
непрерывной. Это означает, что не существует никаких ограничений на диапазон используемых
чисел и точность их представления. Для любого вещественного числа имеется бесконечно много
чисел, которые больше или меньше его, а между любыми двумя вещественными числами также
находится бесконечно много вещественных чисел.
Реализовать такую систему в технических устройствах невозможно. Во всех компьютерах
размеры ячеек памяти фиксированы, что ограничивает систему представимых чисел. Ограничения
касаются как диапазона, так и точности представления чисел, т.е. система машинных чисел
оказывается конечной и дискретной, образуя подмножество системы вещественных чисел.
Число A10 называется нормализованным, если оно представлено в виде:
A10   M 10  10  P10
где M10 – мантисса, десятичная правильная дробь, то есть 0,1 M10 <1; P10 – порядок, целое
десятичное число.
При нормализации числа происходит своеобразное расчленение его на составляющие: знак числа,
знак порядка, модуль мантиссы, модуль порядка.
29710 = 0,297*103
0,03110 = 0,31*10-1
2
-34,176 = -0,34176*10
M10 = 0,297
P10 = 3
M10 = 0,31
P10 = -1
M10 = -0,34176
P10 = 2
Упражнение 24. Приведите к нормализованному виду следующие числа, не переводя их в
десятичную систему счисления: -0,00000101112, 98765,ABC16.
Решение.
 0,00000101112  0,101112 10 21012
516
98765, ABC16  0,8765 ABC16 1016
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
21
Упражнение 25. Запишите в естественной форме следующие нормализованные
3
1
0,10112 1010
2 , 0,1234510 1010 , 0, ABCD16 1016
числа:
Решение.
0,10112 1010
2  0,10112 100 2  10,112
3
0,1234510 1010
 0,1234510 1000 3  123,4510
1
0, ABCD16 1016
 0, ABCD16  0,116  0,0 ABCD16
В ЭВМ арифметические устройства работают с нормализованными числами, но не с десятичными,
а с двоичными.
Для вещественных чисел применяется формат с плавающей точкой. Значащие цифры числа
находятся в поле мантиссы; поле порядка показывает фактическое положение двоичной запятой в
разрядах мантиссы, а бит знака определяет знак числа.
Мантисса, называемая также «дробью» F (Fraction), представлена в прямом коде. Порядок E
(Exponent) дается в смещенной форме: он равен истинному порядку, увеличенному на значение
смещения. Значение смещения для трех разных форматов равно 127 (8 бит), 1023 (10 бит) и 16383 (15
бит). Задание порядка в форме со смещением упрощает операцию сравнения чисел с плавающей
точкой, превращая ее в операцию сравнения целых чисел. Смещенный порядок называется также
«характеристикой», ее можно считать целым положительным и беззнаковым числом.
Значение числа равно:
(-1)s*2E-смещение*F0,F1F2...Fn, F0=1
где n для разных форматов равно 23, 52, или 63.
S
Exponent
Fraction
Отметим наличие в мантиссе бита единиц F0. В коротком и длинном вещественных форматах бит
F0 при передачах чисел и хранении их в памяти не фигурирует. Это так называемый скрытый или
неявный бит, который в нормализованных числах содержит единицу. Числа во временном
вещественном формате имеют явный бит F0. Такой формат позволяет несколько повысить скорость
выполнения операций. Числа во временном вещественном формате называются еще числами с
расширенной точностью.
Подробные описания вещественных форматов смотри в конце данной разработки.
Упражнение 26. Представим десятичное число -247,375 в вещественных форматах. Двоичный код
его равен -11110111,0112 и истинный порядок получается +710=1112.Смещенный порядок в трех
вещественных форматах равен: 13410=100001102, 103010=100000001102 и 1639010=1000000000001102.
Знак
Порядок
Мантисса
Короткое вещественное
1
10000110
11101110110...0
Длинное вещественное
1
10000000110
11101110110...0
Временное вещественное
1
100000000000110
111101110110...0
Упражнение 27. Найдите соответствие между машинными вещественными типами и типами
данных Паскаля. Ответ: Короткое вещественное – Single, длинное вещественное – Double, временное
вещественное – Extended.
Упражнение 28. Значение переменной A представлено в формате с плавающей точкой в
шестнадцатеричной системе счисления A=C2F2000016. Тип переменной A – single для языка
программирования Паскаль. Найти десятичной значение числа A.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
22
Решение.
Преобразуем шестнадцатеричное представление в двоичное. Вычленим из представления знак,
порядок и мантиссу. A=C2F2000016=110000101111001000000000000000002.
Знак числа – старший бит – 1. Следовательно, искомое число отрицательное.
Порядок числа в памяти компьютера хранится в прямом коде со смещением. Найдем его:
Pсм  100001012 . Найдем реальный порядок, от порядка со смещением отнимем величину смещения
12710,
Pреал  100001012  011111112  110 2  610 .Следовательно, знак «двоичной» запятой в
мантиссе нужно сместить вправо на 6 позиций.
Вспомним, что первый бит мантиссы – неявный, поэтому реальная мантисса имеет вид
M  1,1110012 .
Совмещаем знак, мантиссу и порядок: A  11110012  121,010 .
Упражнение 29. Значение переменной A представлено в формате с плавающей точкой в
шестнадцатеричной системе счисления A=430F000016. Тип переменной A – single для языка
программирования Паскаль. Найти десятичной значение числа A. Ответ: +143,010.
Упражнение 30. Значение переменной A представлено в формате с плавающей точкой в
шестнадцатеричной системе счисления A=С244000016. Тип переменной A – single для языка
программирования Паскаль. Найти десятичной значение числа A. Ответ: -49,010.
Вещественная арифметика
Пусть a  0, ma  2 a , b  0, mb  2 b – два нормализованных двоичных числа, и qa  qb (в
противном случае мы можем просто поменять их местами). Результатом их сложения или вычитания
q q
q
будет являться следующее выражение: c  (0, ma  0, mb  2 b a )  2 a .
q
q
Порядок вычислений при этом таков:
1.
Порядки чисел a и b выравниваются по большему из них (в нашем случае это qa). Для этого
мантисса числа b сдвигается на qa-qb разрядов вправо(часть значащих цифр при этом могут
оказаться утерянными), а его порядок становится равным qa.
2.
Выполняется операция сложения (вычитания) над мантиссами с округлением по значению
n+1-ой значащей цифры результата.
3.
Мантисса результата должна быть нормализована (получившийся после нормализации
порядок может отличаться от qa как в меньшую, так и в большую сторону).
Все последующие упражнения будем выполнять в двоичной системе счисления без перевода в
машинное представление!
Упражнение 31. Сложите два числа с плавающей запятой в двоичной системе счисления:
и 0,1112 10 211 .
0,10012 10101
2
Решение.
Перед сложением необходимо выровнять порядки – меньший порядок «приводится» к большему.
В данном случае второе слагаемое приводится к виду: 0,000000001112 10101
2 . После чего выполняем
сложение:
+
0,00000000111×10101
0,10010000000×10101
0,10010000111×10101
Если наша ячейка памяти имела бы восемь разрядов для хранения мантиссы, то последние три
единичные разряда бы пришлось округлять.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
23
Упражнение 32. Продумайте, какие ошибки могут возникнуть при вычислении по данному
алгоритму. Приведите примеры.
Ответ.
1. Потеря значащих цифр мантиссы у меньшего из чисел при выравнивании порядков.
2. Потеря крайней справа значащей цифры результата при сложении или вычитании мантисс.
3. Выход за границу допустимого диапазона значений того или иного вещественного типа при
нормализации результата.
Рассмотрим теперь умножение и деление нормализованных чисел a и b в машинной арифметике (с
ограниченным числом разрядов):
d  a  b  (0, ma  0, mb )  2 qa qb ;
f  a  b  (0, ma  0, mb )  2 qa qb
Для получения результата в данном случае производятся следующие действия, причем уже не
важно, какое из двух данных чисел больше.
1.
Мантиссы перемножаются (или одна делится на другую), при этом результат округляется до
n значащих цифр (отметим, что при умножении может получиться 2n значащих цифры в
мантиссе, а при делении – бесконечно много).
2.
Порядки при умножении складываются, а при делении вычитаются.
3.
При необходимости мантисса результата нормализуется.
Над мантиссами в арифметическом устройстве компьютер должен уметь выполнять все четыре
операции (сложение, вычитание, умножение и деление), а также операции сдвига, тогда как над
порядками производятся только действия сложения и вычитания. Для осуществления этих сложных
для компьютера операций в его составе должен быть арифметический сопроцессор.
Упражнение 33. Выполнить умножение двух нормализованных двоичных числа, пользуясь
алгоритмом машинной арифметики: 0,10012 10101
и 0,1112 10 211 .
2
Решение.
Складываем порядки этих чисел: 10111=01.
Перемножаем мантиссы:
×
0,1001
0,111
0,0111111
В результате получили число: 0,01111112 1010
2 . Приведем мантиссу в нормализованный вид:
0,1111112 1012 .
Если бы в этом примере были большие значения порядков (например, 32 и 76), то в машинном
представлении результата биты, выделенные под хранение порядка, не смогли бы вместить истинный
порядок числа. Следовательно, операция умножения не будет произведена по причине переполнения
порядка.
Упражнение 34. Выполнить деление двух нормализованных двоичных числа, пользуясь
алгоритмом машинной арифметики: 0,10012 10101
разделить на 0,1112 10 211 .
2
Решение.
Найдем порядок результата: 101-(-11)=101+11=1000.
0,1001  0,111  0,10(1001) .
Делим
мантиссы
(столбиком!):
нормализованной, но(!) периодической. Что же делать?
Мантисса
получилась
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
24
Когда говорят о точности представления десятичных вещественных чисел, нужно помнить
следующее: десятичное число невозможно записать точно в любом из машинных вещественных
типов. Объясняется это тем, что конечные десятичные дроби часто оказываются бесконечными
периодическими двоичными дробями (см. упражнения по переводу правильных дробей из
десятичной системы счисления в двоичную). Следовательно, в нормализованном виде такое число
будет иметь бесконечную мантиссу и не может быть представлено точно. При записи подобной
мантиссы в память компьютера число округляется.
Если под мантиссу отведено n бит и n+1 значащая цифра двоичной нормализованной мантиссы
равна 0, то цифры начиная с n+1-ой просто отбрасываются, если же n+1-ая цифра равна единице, то к
целому числу, составленных из n значащих цифр мантиссы, прибавляется единица.
Упражнение 35. Найдите значение мантиссы числа a=0,110 при двоичной нормализации для
различных значений n (разрядности мантиссы).
Решение.
a  0,110  0,0(0011) 2  0,11(0011) 2 10 2112
Пусть n=10, тогда m=1100110011 (остальные цифры мантиссы отброшены в результате
округления).
Пусть n=12, тогда m=110011001101 (последняя цифра изменилась с 0 на 1 при округлении).
Пусть n=13, тогда m=1100110011010 (две последние цифры изменились при прибавлении 1).
Упражнение 36. Подумайте, какие ошибки могут возникнуть при умножении и делении чисел в
формате с плавающей запятой.
Ответ. Получение не представимого в используемом формате порядка числа, как положительного,
так и отрицательно. Это так называемая ситуация «арифметического переполнения».
Итоговые творческие задания
Упражнение 37. Напишите программу, переводящую число из любой системы счисления в
любую другую.
Упражнение 38. Напишите программу, которая переводит десятичное число в машинное
представление с плавающей запятой (короткое вещественное).
Упражнение 39. Напишите программу, иллюстрирующую умножение двух знаковых целых
числа.
Упражнение 40. Напишите программу, иллюстрирующую нормализацию вещественных чисел и
выполнения действий над ними по правилам машинной арифметики.
Упражнение 41. Напишите программу, иллюстрирующую ошибки компьютера при выполнении
действий над вещественными числами.
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
Формат
Короткое вещественное
25
Общая
длина
(байт)
Знак
мантиссы
(бит)
Порядок
(бит)
Мантисса
(бит)
Смещение
порядка
Диапазон
представимых
чисел
Точность в
десятичной
системе счисления
Особенность
представления
4
1
8
23
12710
10-42…1038
7 – 8 цифр
неявный бит F0
15 – 16 цифр
неявный бит F0
19 – 20 цифр
явный бит F0
Длинное вещественное
8
1
10
53
102310
Временное вещественное
10
1
15
64
1638310
10
…10
-324
308
10-4951…104932
Лапшева Елена Евгеньевна, главный методист кафедры информатики СарИПКиПРО
26
Литература
1. Григорьев В.Л. Архитектура и программирование арифметического
сопроцессора. – М.: Энергоатомиздат, 1991.
2. Андреева Е., Фалина И. Информатика: Системы счисления и компьютерная
арифметика. – М.: Лаборатория Базовых Знаний, 1999.
3. Немнюгин С.А. Turbo Pascal. – СПб.: Питер, 1999.
26
Download