Про підручник

У даному практичному керівництві розглядаються популярні системи числення, правила подання чисел у цих системах й приклади перетворень чисел з однієї системи числення в іншу письмово та із застосуванням:

Підручник містить словник основних понять і додатки, в яких подана інформація про застосування систем числення в комп’ютерних системах, відповідно:

Підручник містить велику кількість практичних прикладів із детальними поясненнями, задачі для самостійного виконання, і може бути використаний:

  • при вивченні модуля Математичні основи інформатики в курсі шкільної інформатики;

  • на заняттях гуртків і факультативів з програмування;

  • для розширення власного розуміння про системи числення.


Для вчителів і викладачів інформатики, учнів та студентів й усіх, хто цікавиться інформатикою.

Вступ

У перших обчислювальних пристроях, що були прообразами сучасних комп’ютерів, важливу роль відігравали вибрані для них системи числення.

Система числення - це правила запису чисел за допомогою спеціальних знаків - цифр, а також відповідні правила виконання дій з цими числами.

Перші механічні лічильні машини (суматор Блеза Паскаля (1642 рік), лічильна машина Вільгельма Лейбніца (1673 рік), аналітична машина Чарлза Беббіджа (1848 рік) були створені на основі десяткової системи числення.

У 1938 році Конрад Цузе створив машину Z1, що була основана на принципах дії аналітичної машини Чарлза Беббіджа, але використовувала двійкову систему числення.

В сучасних комп’ютерах також використовується двійкова система числення і вся інформація зберігається у вигляді послідовностей нулів та одиниць.

Розглянемо принципи побудови основних систем числення, а також познайомимось із системами числення, що використовуються в комп’ютерах.

Непозиційні системи числення

Найпростіший спосіб порахувати, який використовує людина, - це «порахувати на пальцях». Один палець позначає одиницю (один день, одне дерево і т.д.).

Така система числення називається унарною - цифрами такої системи можуть використовуватися будь-які однакові предмети або символи (камінці, вузлики, засічки на дереві тощо).

За допомогою унарної системи числення можна записувати лише натуральні числа.

Натуральні числа - числа, що виникають природним чином при лічбі: 1, 2, 3, ... . Натуральні числа можна записувати за допомогою десяти цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Якщо використовувати унарну систему числення для запису великих чисел, то запис таких чисел виходить занадто довгим (уявіть собі, як записати тисячу чи, навіть, мільйон).

Наприклад, числа 1, 2, 3, 4, 5, ... будуть виглядати в унарній системі так:

1, 11, 111, 1111, 11111, ...

Цифра будь-якої позиції числа, записаного в унарній системі числення, завжди позначає одиницю, тому унарна система відноситься до непозиційних систем числення.

Непозиційна система числення - це система числення, в якій значення цифри у числі не залежить від позиції цієї цифри в записі числа.

Ще однією непозиційною системою числення є римська система числення.

Ця система числення на сьогодні майже не застосовується, бо виконання арифметичних дій над багатозначними числами в цій системі дуже незручне.

Однак, її використовують для позначення століть, розділів і частин законів, томів видань, валентності хімічних елементів, а також з естетичною метою.

Римські цифри

Вважається, що римські цифри були винайдені не самими римлянами, а їхніми історичними попередниками - етрусками. Римляни лише запозичили ці цифри за п’ять століть до н.е., вдосконалили цифри і правила їх використання й дали їм своє ім’я.

Від римлян римські цифри перейшли до інших народів Європи і були у вжитку до XIII-XV ст., коли на зміну ним прийшли арабські цифри.

У Римській системі числення використовуються символи (літери латинської абетки)

I, V, X, L, C, D, M

Значення римських цифр:

  • I - один (1);

  • V - п’ять (5);

  • X - десять (10);

  • L - п’ятдесят (50);

  • C - сто (100);

  • D - п’ятсот (500);

  • M - тисяча (1000).

Римські цифри мають лише абсолютні значення і не мають позиційної значимості: I - це завжди 1, V - завжди 5, X - завжди 10 і т.д.

Натуральні числа записуються в Римській системі числення за допомогою повторення римських цифр, а загальне значення римського числа визначається шляхом додавання абсолютних значень його цифр. Наприклад:

VII = 5 + 1 + 1 = 7

Тут символи V і I означають, відповідно, 5 і 1, незалежно від їх місця у числі.

В Римській системі числення існує ряд правил і обмежень запису чисел:

  • за допомогою класичної римської системи числення можна записувати лише натуральні числа в діапазоні 0-3999;

  • неможливо записати дробові і від’ємні числа, а для запису великих чисел необхідно вводити додаткові цифри;

  • цифри I, X, C і M можуть повторюватись, але не більше трьох разів, а цифри V, L і D повторюватись не можуть (дворазове повторення кожної з них дає значення, що позначається наступною старшою цифрою):

MMMDCCCLXXXVIII = 3888
  • цифри I, X, C можуть передувати найближчій або наступній старшій цифрі, але не третій за порядком: IV, IX (але не IL), XL, XC (але не XD і не XM). При цьому вступає в дію принцип віднімання - значення меншої цифри віднімається від значення більшої:

IV = 5 - 1 = 4
IX = 10 - 1 = 9
  • якщо поспіль йдуть однакові або й різні старші цифри, то молодша цифра може розміщуватися тільки передостанньою, наприклад:

XIX = 19
XXIX = 29
XXXIX = 39
XLIX = 49
  • цифри V, L і D не можуть розміщуватися перед найближчою старшою цифрою, так як отримане значення в цьому випадку дорівнює значенню, що позначають самі ці цифри. В результаті, наступні записи є некоректними:

VX
LC
DM

Позиційні системи числення

Відомо, що цифри, якими ми користуємося для запису чисел, а саме 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, називаються арабськими. Але винайдені вони були в Індії! Чому ж тоді їх так називають?

Індо-арабська система числення

Символи, якими сьогодні користуємось ми і називаємо «арабськими», утворилися внаслідок тривалих перетворень первісного вигляду символів, що були створені в I-IV ст. індійськими математиками.

Поширення у світі (зокрема, в Європі) ці цифри отримали завдяки арабам, через що часто згадуються як «арабські». В Європу індійські (арабські) цифри були занесені в X-XI ст., а широке поширення отримали з другої половини XV ст.

В арабській системі числення використовують цифри

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

і ці ж цифри застосовуються для представлення чисел в десятковій системі числення.

Арабська система числення є позиційною системою числення.

Позиційна система числення - система числення, в якій значення цифри залежить від позиції цифри у записі числа.
В позиційних системах числення значення, яке позначене цифрою в числі, залежить від позиції цифри в записі числа, а в непозиційних - значення цифри у числі не залежить від позиції цієї цифри в записі числа.

Проілюструємо різницю у записі чисел в Римській і десятковій системах числення:

  • 11 - у такому записі перша одиниця позначає десять, а друга - один;

  • II - тут обидві одиниці позначають одиницю;

  • 215, 154, 581 - цифра 5 у першому випадку позначає 5, у другому - 50, а у третьому - 500;

  • XXV, XVII, VIII - в усіх записах чисел, де б не стояла цифра V, вона завжди позначає п’ять одиниць (іншими словами, величина, позначена символом V, не залежить від позиції цього символа в числі).

Математичні дії в позиційних системах числення виконується легше, ніж у непозиційних, тому що здійснюються за нескладними алгоритмами (наприклад, множення в стовпець, порівняння двох чисел).

У світі найбільш поширені саме позиційні системи числення. Поруч із знайомою усім десятковою системою числення, в комп’ютерній техніці широкого розповсюдження набули такі позиційні системи числення як двійкова, вісімкова та шістнадцяткова.

Позиційні системи числення мають ряд властивостей.

Основа системи числення - кількість знаків (цифр), які використовуються для запису числа.

Для запису чисел в позиційній системі з основою n необхідно мати алфавіт із n цифр. Зазвичай, для цього при n < 10 використовують n перших арабських цифр, а при n ≥ 10 - до десяти арабських цифр додають букви. Ось кілька прикладів алфавітів деяких позиційних систем:

Таблиця "Алфавіти деяких позиційних систем числення"
Основа Назва Алфавіт

n = 2

Двійкова

0 1

n = 3

Трійкова

0 1 2

n = 8

Вісімкова

0 1 2 3 4 5 6 7

n = 16

Шістнадцяткова

0 1 2 3 4 5 6 7 8 9 A B C D E F

Якщо необхідно вказати основу системи числення, в якій записане число, то вона прописується нижнім індексом для числа. Наприклад:

101112
2123
278
1716

Позицію цифри у числі називають розрядом.

Розрядність числа - кількість цифр, з яких складається число.

Наприклад, 125 - трирозрядне число, 01110011 - восьмирозрядне число. Розряди нумеруються справа наліво і рахунок починається з 0.

Наприклад, в десятковому числі 1981:

  • остання цифра 1 знаходиться в нульовому розряді (одиниці, 100);

  • цифра 8 знаходиться в першому розряді (десятки, 101);

  • цифра 9 - у другому розряді (сотні, 102);

  • перша цифра 1 - у третьому розряді (тисячі, 103).

Запис числа 1981 називається згорнутою формою запису числа. У загальному випадку, для довільного числа (цілого чи дробового - при цьому ціла частина відділяється від дробової комою, як ми звикли записувати, чи крапкою, як це відбувається в комп’ютерному системах), вона має вигляд:

aq = (an-1an-2…​a1a0,a-1a-2…​a-m)q

У цьому загальному вигляді згорнутої форми запису числа:

  • aq - вхідне число;

  • q - основа системи числення;

  • ai - цифри, які належать алфавіту даної системи числення;

  • n - кількість розрядів цілої частини числа (нумерація розрядів починається з 0 справа наліво);

  • m - кількість розрядів дробової частини числа (нумерація розрядів починається з 1 зліва направо і записується зі знаком -).

Нижні індекси визначають місце розташування цифри в числі (розряд):

  • додатні значення індексів - для цілої частини числа;

  • від’ємні значення індексів - для дробової частини числа.

Саме згорнутою формою запису числа ми і користуємося в повсякденному житті.

Десяткове число 1981 можна записати й у іншій формі

1981 = 1 · 103 + 9 · 102 + 8 · 101 + 1 · 100

яка називається розгорнутою формою запису числа. Із цієї форми запису числа видно, що остання цифра 1 - це залишок від ділення вхідного числа на 10, число, складене з двох останніх цифр (81), - це залишок від ділення вхідного числа на 100 і т.д.

Щоб визначити число, записане в позиційній системі числення, необхідно значення кожної цифри помножити на основу системи числення в степені, що дорівнює розряду цієї цифри, і додати отримані значення.

Інший спосіб подання десяткового числа 1981 (не використовуючи операції піднесення до степеня) - за схемою Горнера :

1981 = ((1 · 10 + 9) · 10 + 8) · 10 + 1

Якщо число 1981 позначити як a3a2a1a0, де a3, a2, a1 і a0 - окремі цифри, які розташовані в третьому, другому, першому і нульовому розрядах відповідно, і записати в системі числення q, то запис числа за схемою Горнера набуде загального вигляду:

a3a2a1a0 = ((a3 · q + a2) · q + a1) · q + a0

Підсумовуючи, для запису довільного числа в позиційній системі числення з основою q розгорнута форма запису числа матиме наступний вигляд:

aq = ±(an-1qn-1 + an-2qn-2 + …​ + a0q0 + a-1q-1 + a-2q-2 + …​ + a-mq-m)

Наприклад:

  • якщо q = 10, то для числа 1591,87210 в десятковій системі числення кількість розрядів n = 4, m = 3;

  • якщо q = 2, то для числа 1101,112 у двійковій системі числення кількість розрядів n = 4, m = 2.

Розряди нумеруються з 0 справа наліво (для цілої частини числа) і з 1 зліва направо (для дробової частини числа). Тому в обох вказаних прикладах маємо для цілої частини числа кількість розрядів n = 4 (розряди 0, 1, 2, 3), а для дробової частини числа кількість розрядів m = 3 (розряди 1, 2, 3) і m = 2 (розряди 1, 2) відповідно.
Розгорнута форма запису числа дозволяє записувати будь-яке ціле або дробове (подається як сума цілої і дробової частин, будь-яка з цих частин може бути відсутня) невід’ємне число в заданій позиційній системі числення. Для позначення від’ємного числа використовується знак -, після якого, за тими самими правилами, записується модуль числа.
Цілу і дробову частини, у записі дробового числа, завичай, розділяють символом «коми». Далі, в записі дробових чисел, будемо дотримуватися такого позначення, пам’ятаючи, що в комп’ютерних системах для цих речей використовується розділювач «крапка».
Схему Горнера і розгорнуту форму запису числа можна використовувати для перетворення числа із будь-якої системи числення в десяткову систему числення.

Наведемо кілька прикладів, в яких використовуються вищезгадані форми запису чисел.

Отримаємо розгорнуту форму для десяткових чисел 23145 і 23,145:

2314510 = 2 · 104 + 3 · 103 + 1 · 102 + 4 · 101 + 5 · 100
23,14510 = 2 · 101 + 3 · 100 + 1 · 10-1 + 4 · 10-2 + 5 · 10-3

Запишемо розгорнуту форму для чисел в різних системах числення: 1100112, 1213, 15FC16, 110,012:

1100112 = 1 · 25 + 1 · 24 + 0 · 23 + 0 · 22 + 1 · 21 + 1 · 20
1213 = 1 · 32 + 2 · 31 + 1 · 30
15FC16 = 1 · 163 + 5 · 162 + F · 161 + C · 160
110,012 = 1 · 22 + 1 · 21 + 0 · 20 + 0 · 2-1 + 1 · 2-2

Усі числа із попереднього прикладу переведемо в десяткову систему за допомогою розгорнутої форми запису:

1100112 = 1 · 25 + 1 · 24 + 0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 = 32 + 16 + 0 + 0 + 2 + 1 = 5110
1213 = 1 · 32 + 2 · 31 + 1 · 30 = 9 + 6 + 1 = 1610
15AF16 = 1 · 163 + 5 · 162 + A (10) · 161 + F (15) · 160 = 4096 + 1280 + 160 + 15 = 555110
110,012 = 1 · 22 + 1 · 21 + 0 · 20 + 0 · 2-1 + 1 · 2-2 = 4 + 2 + 0 + 0 + 0.25 = 6,2510
У прикладах вище, розгорнута форма запису була застосована до дробових чисел. Детальніше про дробові числа читайте у наступних розділах підручника, присвячених перетворенню дробових чисел і зберігання їх у пам’яті комп’ютера.

Знаючи десяткове число і його запис в деякій позиційній системі числення, можна знайти основу цієї системи.

Наприклад, число 45 в деякій позиційній системі з основою x записується як 55x. Знайдемо основу цієї системи числення. Для цього запишемо це число в розгорнутій формі:

45 = 55x = 5 · x1 + 5 · x0 = 5 · x + 5

Розв’язуючи рівняння 45 = 3 · x + 7 відносно невідомого x, отримаємо x = 8. Отже, шукана основа системи числення - 8 (вісімкова).

У складніших випадках може утворитися рівнняння 2-го або вищого степеня. Наприклад, візьмемо число 29, яке в деякій системі числення записується як 104x. Знайдемо основу цієї системи числення. Запишемо число в розгорнутій формі:

29 = 104x = 1 · x2 + 0 · x1 + 4 · x0 = x2 + 0 + 4

Розв’язуючи рівняння

29 = x2 + 4

відносно невідомого x, отримаємо два корені x1 = 5 і x2 = -5. Правильна відповідь 5, оскільки шукана основа системи числення має бути додатною.

Якщо ж запис числа в системі числення заданий не повністю, рішень може бути декілька. Наприклад, знайдемо усі основи систем числення, в яких запис десяткового числа 29 закінчується на 5. Використаємо схему Горнера, з якої слідує

29 = k · x + 5

де x - невідома основа системи числення, k - деяке натуральне число або 0. Отже, з отриманого рівняння

24 = k · x

можна визначити можливі значення основ систем числення - вони є дільниками числа 24. Таких дільників є 8: 1, 2, 3, 4, 6, 8, 12, 24. Оскільки, останньою цифрою у числі є 5, системи числення з основами 1, 2, 3, 4 нам не підходять, бо не мають в своєму алфавіті цифри 5. Тому, умові задачі задовільняють тільки основи 6, 8, 12, 24.

Знайдемо усі десяткові числа, які не більші за 28, запис яких в системі числення з основою 3 закінчується на 22. Використаємо схему Горнера, яка для нашої задачі матиме вигляд:

n = ((k · q + a1) · q + a0

де n - шукані числа, k - деяке натуральне число або 0, q - основа системи числення (q = 3), a1 = 2, a0 = 2. Підставимо значення і отримаємо рівняння:

n = ((k · 3 + 2) · 3 + 2

Після розкривання дужок

n = k · 32 + 2 · 3 + 2 = k · 9 + 8

підставимо в рівняння значення k = 0, 1, 2, 3, 4,... і знайдемо відповідні числа n = 8, 17, 26, які задовільняють нашій умові (менше 28).

Основні поняття 2-3-8-10-16 систем числення

Одне і те ж число можна подати у різних системах числення. Подання числа при цьому різне, а значення залишається незмінним.

Коли пишуть ціле число, наприклад, 153, то використовують десяткову (за основою 10) систему числення.

Цифрами у десятковій системі є 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

«Всередині себе» комп’ютер використовує двійкову (за основою 2) систему числення.

Двійкова система числення містить тільки дві цифри, а саме 0 і 1.

Двійкові числа, як правило, значно довше їх десяткових еквівалентів.

Тому дві інші системи числення - вісімкова (за основою 8) і шістнадцяткова (за основою 16) - є дуже популярними, оскільки роблять зручним запис двійкових чисел.

У вісімковій системі використовуються цифри з діапазону від 0 до 7.
Вісімкова система числення

Вісімкова система числення використовується в Linux-системах (та інших Unix-подібних операційних системах) для позначання прав доступу до файлів для команди chmod .

Режим доступу кодується трьома бітами, які дозволяють:

  • читання (r, read);

  • запис (w, write);

  • виконання (x, execute).

Наприклад, код 7 = 1112 (rwx) означає, що наданий повний доступ (усі біти увімкнені) і користувач може читати, записувати та запускати на виконання файл, а код 4 = 1002 (r--) означає, що користувач має право читати файл, а от записувати у нього і запускати на виконання - ні.

У шістнадцятковій системі виникає проблема запису чисел, оскільки тут потрібно шістнадцять цифр - найменша з яких 0 і найбільша зі значенням, еквівалентним десятковому числу 15 (на одиницю менше основи 16).

Для представлення шістнадцяткових чисел із значеннями від 10 до 15 (в десятковому еквіваленті) домовилися використовувати літери від A до F.

Так, у шістнадцятковому представленні можна написати, наприклад, число 584, що має десятково-подібний вигляд і містить тільки цифри, або число 459DD5, що містить цифри і літери, або число FFF, що складається лише з літер.

Таблиця "Цифри двійкової, вісімкової, десяткової і шістнадцяткової систем числення"
Двійкові цифри Вісімкові цифри Десяткові цифри Шістнадцяткові цифри

0

0

0

0

1

1

1

1

2

2

2

3

3

3

4

4

4

5

5

5

6

6

6

7

7

7

8

8

9

9

A (десяткове значення 10)

B (десяткове значення 11)

C (десяткове значення 12)

D (десяткове значення 13)

E (десяткове значення 14)

F (десяткове значення 15)

Таблиця "Порівняння двійкової, вісімкової, десяткової і шістнадцяткової систем числення"
Атрибут Двійкова система Вісімкова система Десяткова система Шістнадцяткова система

Основа

2

8

10

16

Найменша цифра

0

0

0

0

Найбільша цифра

1

7

9

F

У кожній із зазначених систем числення використовується позиційна нотація - кожне місце, на якому стоїть цифра, має різне позиційне значення. Тому такі системи числення є позиційними.

Ще раз нагадаємо особливості позиційних систем числення у наведених нижче прикладах.

Наприклад, у десятковому числі 628 (цифри 6, 2 і 8 називають символьними значеннями), говорять, що цифру 8 записано в позиції одиниць, 2 - в позиції десятків, 6 - в позиції сотень.

Кожна з цих позицій є відповідним степенем основи 10; ці степені починаються з 0 і збільшуються на 1 в міру переміщення вліво вздовж числа.

Таблиця "Позиційні значення в десятковій системі числення"

Десяткова цифра

6

2

8

Ім’я позиції

Сотень

Десятків

Одиниць

Позиційне значення

100

10

1

Позиційне значення як степінь основи (10)

102

101

100

Для великих десяткових чисел такими позиціями зліва будуть позиції:

  • тисяч (103)

  • десятків тисяч (104)

  • сотень тисяч (105)

  • мільйонів (106)

  • десятків мільйонів (107)

  • і т.д.

У двійковому числі 101 видно, що крайня права одиниця записана в позиції одиниць, 0 знаходиться в позиції двох і крайня ліва одиниця в позиції чотирьох. Зауважимо, що кожна з цих позицій є степенем основи (числа 2); ці степені починаються з 0, збільшуючись на одиницю відповідно до зміни по числу вліво.

Таблиця "Позиційні значення у двійковій системі числення"

Двійкова цифра

1

0

1

Ім’я позиції

Чотирьох

Двох

Одиниць

Позиційне значення

4

2

1

Позиційне значення як степінь основи (2)

22

21

20

Для великих двійкових чисел такими позиціями зліва будуть позиції:

  • восьми (23)

  • шістнадцяти (24)

  • тридцяти двох (25)

  • шістдесяти чотирьох (26)

  • і т.д.

Для вісімкового числа 425 говорять, що цифра 5 записана в позиції одиниць, 2 - в позиції восьми і 4 - в позиції шістдесяти чотирьох. Зауважимо, що кожна з цих позицій є степенем основи (числа 8); ці степені починаються з 0, збільшуючись на одиницю відповідно до зміни по числу вліво.

Таблиця "Позиційні значення у вісімковий системі числення"

Вісімкова цифра

4

2

5

Ім’я позиції

Шістдесяти чотирьох

Восьми

Одиниць

Позиційне значення

64

8

1

Позиційне значення як степінь основи (8)

82

81

80

Для великих вісімкових чисел наступними зліва будуть позиції:

  • п’ятсот дванадцяти (83)

  • чотирьох тисяч дев’яноста шести (84)

  • тридцяти двох тисяч семисот шістдесяти восьми (85)

  • і т.д.

Для шістнадцяткового числа 3DA говорять, що A знаходиться в позиції одиниць, D - в позиції шістнадцяти і 3 - в позиції двохсот п’ятдесяти шести. Зауважимо також, що кожна з цих позицій є степенем основи системи числення (числа 16); ці степені починаються з 0, збільшуючись на одиницю відповідно до зміни по числу вліво.

Таблиця "Позиційні значення у шістнадцятковій системі числення"

Шістнадцяткова цифра

3

D

A

Ім’я позиції

Двохсот п’ятидесяти шести

Шістнадцяти

Одиниць

Позиційне значення

256

16

1

Позиційне значення як степінь основи (16)

162

161

160

Для довгих шістнадцяткових чисел наступними зліва будуть позиції:

  • чотирьох тисяч дев’яноста шести (163)

  • шістдесяти п’яти тисяч п’ятсот тридцяти шести (164)

  • і т.д.

Основне застосування вісімкових і шістнадцяткових чисел в комп’ютерних обчисленнях полягає в скороченні довжини запису двійкового представлення чисел.

Таблиця нижче демонструє, як великі двійкові числа можна записати в дуже короткій, стислій формі в системах числення з більшими основами, ніж двійкова система.

Таблиця "Десяткові, двійкові, вісімкові і шістнадцяткові еквіваленти"
Десяткове число Двійкове представлення Вісімкове представлення Шістнадцяткове представлення

0

0

0

0

1

1

1

1

2

10

2

2

3

11

3

3

4

100

4

4

5

101

5

5

6

110

6

6

7

111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F

16

10000

20

10

Вибір системи числення для подання чисел у пам’яті комп’ютера має бути зваженим кроком.

В разі вибору системи числення, зазвичай, враховуються такі вимоги, як надійність подання чисел при використанні фізичних елементів, економічність (використання таких систем числення, в яких кількість елементів для подання чисел із деякого діапазону була б мінімальною).

Наприклад, для запису цілих чисел від 1 до 999 у десятковій системі числення достатньо трьох розрядів, тобто трьох елементів. Оскільки кожен елемент може перебувати в десятьох станах, то загальна кількість станів - 30, у двійковій системі числення 99910 = 11111001112, необхідна кількість станів - 20.

У такому розумінні є ще більш економічна позиційна система числення - трійкова.

Так, для запису цілих чисел від 1 до 999999999 у десятковій системі числення потрібно 90 станів, у двійковій - 60 (99999999910 = 1110111001101011001001111111112), у трійковій системі числення - 57 станів (99999999910 = 21202002000210100003).

Трійкова система числення

Трійкову систему числення застосовують в трійковому комп’ютері - комп’ютері, який використовує для проведення обчислень тризначну логіку, яка оперує трьома значеннями:

  • True (істина);

  • False (хибність);

  • NULL/UNKNOWN (невідомо);

замість більш поширеної бінарної логіки, що використовує два значення:

  • True (істина);

  • False (хибність).

Трійкові цифри можна позначати будь-якими трьома символами, наприклад, {A, B, C}, але при цьому додатково потрібно вказати першість символів (C > B, B > A).

У випадку несиметричної трійкової системи числення, зазвичай, застосовуються цифри: 0, 1, 2.

Для кращого розуміння того, що собою являє трійкова система числення, ознайомтесь з матеріалом на Вікіпедії про цю систему числення.
Трійкова система числення не дістала широкого поширення внаслідок труднощів фізичної реалізації. Дональд Кнут відзначав, що через масове виробництво двійкових компонентів для комп’ютерів, трійкові комп’ютери займають дуже мале місце в історії обчислювальної техніки. Однак трійкова логіка елегантніша і ефективніша від двійкової і в майбутньому, можливо, слід знову повернутися до її розробки.

Розглянемо практичний приклад на застосування трійкової системи числення.

Усі 5-літерні слова, складені з анлійських букв A, B, C, записані в алфавітному порядку. Початок списку наведений нижче:

1. AAAAA
2. AAAAB
3. AAAAC
4. AAABA
…​

Спробуємо знайти слово, яке розташоване на 150-му місці від початку списку.

Ця задача, як не дивно, пов’язана з позиційними системами числення. В словах використовується набір із трьох різних символів, для яких вказаний алфавітний порядок. Замінивши букви A, B, C відповідно на цифри 0, 1 і 2, напишемо початок списку:

1. 00000
2. 00001
3. 00002
4. 00010
…​

Ці числа записані в трійковій системі числення в порядку зростання.

Не важко зрозуміти, що на 150-му місці в цьому списку розташовується десяткове число 149, записане в трійковій системі числення. Тепер залишається перетворити десяткове число 149 у трійкове.

Визначимо правило перетворення чисел з десяткової системи числення в систему числення з основою q.

Для перетворення із десяткової системи числення у систему з основою q, необхідно ділити число націло на q, відкидати залишок на кожному кроці, доки не отримаємо 0, а потім записати знайдені залишки у зворотному порядку.

Переведемо число 149 у трійкове діленням числа націло на основу трійкової системи (3):

Переведення десяткового числа у трійкове
Переведення десяткового числа 14910 у трійкове

Замінивши цифри

14910 = 121123

на букви, отримаємо відповідь:

…​
150. BCBBC
…​

Бінарні числа

У цьому розіділ розглядається двійкова система числення, яка отримала широке розповсюдження у світі обчислювальних пристроїв..

Сьогодні будь-яку інформацію (числову, текстову, графічну, звукову та ін.) в комп’ютері можна подати за допомогою чисел.

Переклад інформації, поданої повідомленням в якомусь первинному алфавіті, у послідовність інших символів (кодів) можна визначити як кодування інформації.

Якщо зіставити числа з літерами, можна записувати текст у цифровій формі.

Кольори є комбінацією інтенсивності світлових потоків червоного, синього і зеленого - цю інтенсивність можна також задати в числових значеннях. Зображення легко уявити у вигляді мозаїки з кольорових квадратів, так що вони теж можуть бути представлені через числа.

Тобто, будь-які дані - це так чи інакше закодована інформація.

Для зберігання інформації комп’ютер використовує пам’ять.

Пам’ять комп’ютера поділена на багато комірок, які називаються байтами. Кожна з комірок зберігає невеликий обсяг даних і має числову адресу.

Одного байта пам’яті вистачає лише для зберігання букви або невеликого числа. Для зберігання значних обсягів даних використовують мільярди байтів пам’яті.

Кожен байт поділений на вісім менших елементів, які називаються бітами.

Термін bit (від англ. binary digit) означає двійкова цифра.

Біти можна уявити у вигляді «кнопок-перемикачів», які можуть бути або «увімкненими» або «вимкненими».

У комп’ютерній техніці біти є електричними компонентами, які можуть мати електричний заряд, або ні. Наявність заряду можна ототожнити з перемикачем у ввімкненому положенні, а відсутність заряду - перемикачем у вимкненому положенні.

Тобто, байт пам’яті можна представити як набір перемикачів, кожен з яких переміщений або у положення ввімкнення (ON), або вимкнення (OFF). Наприклад, якщо в байті необхідно зберегти число 81, то перемикачі будуть розміщені у таких положеннях:

Байт пам’яті як набір перемикачів: положення біт-перемикачів для зберігання числа 81
Байт пам'яті як набір перемикачів: положення біт-перемикачів для зберігання числа 81

Для збереження у байті англійської літери M положення перемикачів будуть наступними:

Положення біт-перемикачів для зберігання у байті англійської літери M
Положення біт-перемикачів для зберігання у байті англійської літери M

Залежно від того, чи «ввімкнено» чи «вимкнено» біт, він може мати одне з двох різних значень:

  • 0 (якщо біт «вимкнено»);

  • 1 (якщо біт «увімкнено»).

Така система числення, яка складається з двох символів (у даному випадку 0 і 1), називається двійковою або бінарною.

Будь-яка інформація, з якою працює сучасна обчислювальна техніка, в пам’яті комп’ютера представляється у вигляді чисел в двійковій системі числення.

Числа, представлені в двійковій системі числення, ще називають двійковими або бінарними числами.

Ось приклад числа, написаного в двійковій системі числення

01110011
Якщо необхідно вказати основу системи числення, в якій записане число, то вона прописується нижнім індексом для числа.

В нашому випадку, запис числа у двійковій системі числення буде наступним:

011100112

Позиція кожної цифри 0 або 1 (розряд) у бінарному числі має своє власне значення. А саме, якщо переміщуватись ліворуч, починаючи від крайньої правої цифри, значення кожної позиції записують наступним чином (2 - основа двійкової системи числення):

Запис значень позицій двійкового числа 01110011
Запис значень позицій двійкового числа 01110011

Відповідно, якщо виконати обчислення (піднесення до степеня), значення кожної позиції будуть такими:

Значення позицій двійкового числа **01110011**
Значення позицій двійкового числа 01110011

Щоб визначити десяткове значення двійкового числа, необхідно додати значення позицій для всіх 1:

Сумування значень позицій двійкового числа **01110011**
Сумування значень позицій двійкового числа 01110011

Сума усіх цих значень позицій становить 115.

Таким чином, значення двійкового числа 011100112 становить 11510 у десятковій системі числення, якою користується людина в повсякденному житті.

Число 115, що зберігається в байті пам’яті, можна зобразити таким чином

Значення позицій двійкового числа **01110011** і біти-перемикачі
Значення позицій двійкового числа 01110011 і біти-перемикачі

Коли всі біти в байті встановлені в 0 (вимкнено), то значення байту дорівнює 0. Якщо всі біти байту встановлені на 1 (увімкнено), то байт зберігає найбільше значення, яке можна зберегти в ньому.

Найбільше значення, яке можна зберегти в байті, дорівнює 255

1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255

Цей ліміт існує тому, що в байті є лише вісім біт.

«Бінарні лампи»

Потренуватися у визначенні бінарних кодів чисел від 1 до 255 можна на сторінці Binary Bulbs за допомогою інтерактивного застосунку «Бінарні лампи».

Цей застосунок створений для CS50 (Computer Science 50) - навчального онлайн-курсу з інформатики та програмування Гарвардського університету.

Що робити, якщо необхідно зберегти число більше 255? Відповідь проста: використовувати більше одного байта.

Наприклад, використаємо два байти разом. Це дає нам 16 біт. Значення позицій цих 16 біт складатимуть

  • 20

  • 21

  • 22

  • 23

  • …​

  • 215

Для великих чисел використовуються два (або більше) байти
Для великих чисел використовуються два (або більше) байти

Як бачимо, максимальне значення, яке можна зберегти у двох байтах, становить 65535. Тобто, в двох байтах можна зберегти будь-яке число від 0 до 65535 включно. Якщо вам потрібно зберегти число більше, ніж це, то потрібно використати більше байтів.

Для прикладу, порахуємо кількість значень, які можна зберегти, якщо використовувати 6-байтну комірку пам’яті (така комірка має 48 біт)

248 = 281 474 976 710 656

Сьогодні комп’ютери обробляють різні види інформації, не лише числову, але й графічну, текстову, звукову. Тому така інформація спочатку кодується за допомогою цілих чисел, які потім перетворюються в двійковий вигляд для зберігання в комп’ютері.

Зокрема, символьна інформація також кодується за допомогою двійкових кодів.

Кожна буква належить певному алфавіту, в якому символи слідують один за одним і, отже, можуть бути пронумеровані послідовними цілими числами. Кожній букві можна зіставити ціле додатне число і назвати його кодом символу. Саме цей код буде зберігатися в пам’яті комп’ютера, а при виведенні на екран або папір «перетворюватися» у відповідний йому символ.

Відповідність букв певного алфавіту з числами-кодами формує так звану таблицю кодування. Іншими словами, кожен символ конкретного алфавіту має свій числовий код відповідно до певної таблиці кодування.

Однак, алфавітів у світі дуже багато (український, англійський та ін.), тому виникає питання: «Як закодувати всі використовувані на комп’ютері алфавіти?»

ASCII

У 60-х роках XX століття в Американському національному інституті стандартизації (ANSI ) була розроблена таблиця кодування символів, яка згодом була використана у всіх операційних системах.

Ця таблиця називається ASCII (від англ. American Standard Code for Information Interchange), що означає Американський стандартний код для обміну інформацією. Трохи пізніше з’явилася розширена версія ASCII.

У відповідності з таблицею кодування ASCII для подання одного символу виділяється 1 байт (8 біт). Набір з 8 біт може зберегти

28 = 256

різних значень.

Перші 128 значень (від 0 до 127) постійні і формують так звану основну частину таблиці, куди входять десяткові цифри, букви латинського алфавіту (великі і малі), розділові знаки (крапка, кома, дужки і ін.), а також пропуск і різні службові символи (табуляція, перенесення рядка і ін.).

Значення від 128 до 255 формують додаткову частину таблиці, де прийнято кодувати символи національних алфавітів.

Таблиця ASCII-кодів символів і їх подання у різних системах числення (Decimal - десяткова, Hexadecimal - шістнадцяткова, Binary - двійкова, Octal - вісімкова)
Таблиця ASCII-кодів символів і їх подання у різних системах числення: Decimal - десяткова, Hexadecimal - шістнадцяткова, Binary - двійкова, Octal - вісімкова

Наприклад, код ASCII для великої англійської літери M становить 77. Коли ви натискаєте клавішу з великою літерою M на клавіатурі комп’ютера, число 77 зберігається в пам’яті (звичайно, як бінарне число)

Англійська літера M зберігається у пам’яті як бінарне число 01001101
Англійська літера M зберігається у пам’яті як бінарне число 01001101

Оскільки національних алфавітів надзвичайно багато, то існують розширені ASCII-таблиці у різних варіантах. Це створює додаткові труднощі у відображенні символів, наприклад, при використанні одночасно різних схем кодування.

Unicode

У 1991 році був створений стандарт кодування символів Unicode (від англ. Unicode, УНІфіковане КОДування) - промисловий стандарт, розроблений для забезпеченння цифрового представлення символів усіх писемностей світу та спеціальних символів.

Таблиця символів Unicode знімає обмеження на кодування символів лише одним байтом. Натомість, використовується 17 просторів, кожен з яких визначає 65536 кодів і дає можливість описати максимум

17 · 216 = 1 114 112

різних символів.

Unicode має декілька реалізацій, з яких найпоширенішими є: UTF (Unicode Transformation Format) - Формат Перетворення Юнікоду і UCS (Universal Character Set) - Універсальна Таблиця Символів. Число після UTF визначає кількість бітів, що виділені під один символ, а число після UCS - кількість байтів.

UTF-8 - стандарт, який став найпоширенішим для інтернаціональних кодувань, що реалізовує представлення Unicode, сумісне з 8-бітовим кодуванням тексту.

UTF-8 є системою кодування зі змінною довжиною кодування символів. Це означає, що UTF-8 для кодування символів використовує від 1 до 4 байт на символ. Так, перший байт UTF-8 можна використовувати для кодування ASCII, що дає повну сумісність з кодами ASCII.

Простіше кажучи, текст, що складається тільки з символів з номером менше 128 (символи латинського алфавіту, розділові знаки і керуючі символи), при записі в UTF-8 перетворюється на звичайний текст ASCII. І навпаки, в тексті UTF-8 будь-який байт із значенням менше 128 зображає символ ASCII з тим же кодом. Решта символів Unicode зображається послідовностями завдовжки від 2 до 4 байтів.

Кодування UTF-8 дозволяє працювати в стандартизованому міжнародно прийнятому багатомовному середовищі, з порівняно незначним збільшенням обсягу даних при кодуванні.

Інші типи даних і бінарні коди

Графічна інформація, звукові та відео дані в комп’ютері також подаються у вигляді двійкових послідовностей - бінарних чисел.

Для прикладу, переглянемо перших 12 байтів файла, у якому збережена цифрова фотографія

Гвідо ван Россум, нідерландський програміст, розробник популярної високорівневої мови програмування Python
Гвідо ван Россум, нідерландський програміст, розробник мови програмування Python

Для цього використаємо невеликий скрипт, написаний на Python

with open("gvanrossum.jpg", "rb") as f:
    # читання байтів з файлу
    byte_data = f.read(12) # вказати кількість байтів, які будуть прочитані, або усі
    # виведення байтового об'єкта
    print(byte_data)
    # виведення значення окремого байта у різних системах числення
    for i in byte_data:
        print(f'{i:d} {i:b} {i:x} {i:o}')

При успішному виконанні скрипта отримаємо такі результати

b'\xff\xd8\xff\xdb\x00C\x00\x06\x04\x05\x06\x05' (1)
255 11111111 ff 377
216 11011000 d8 330
255 11111111 ff 377
219 11011011 db 333 (2)
0 0 0 0
67 1000011 43 103 (3)
0 0 0 0
6 110 6 6
4 100 4 4
5 101 5 5
6 110 6 6
5 101 5 5

Щоб проаналізувати подані результати, наведемо кілька тверджень.

Байти - це байти, а символи - це абстракція.

Незмінна послідовність символів Unicode називається рядком.

Незмінна послідовність чисел між 0 та 255 називається байтовим об’єктом.

Для запису байтового об’єкта використовують синтаксис b (байтовий літерал). Кожен байт у літералі може бути символом ASCII чи шістнадцятковим кодом від \x00 до \xff (0255).

Елементами рядка є символи, елементи байтового об’єкта - цілі числа. Якщо точніше, цілі числа в діапазоні 0255.

Отже, повертаючись до результатів роботи скрипта, можна зробити наступні висновки:

  1. Це рядок байтів (байтовий об’єкт), у якому байти записані в шістнадцятковій системі числення або як символи ASCII (в нашому випадку, є такий єдиний символ - велика англійська літера C);

  2. 219 11011011 db 333 - це представлення байта \xdb у різних системах числення (219 - десяткова, 11011011 - двійкова, db - шістнадцяткова, 333 - вісімкова відповідно);

  3. 67 1000011 43 103 - це представлення байта C як символа ASCII (велика англійська літера C) у різних системах числення (67 - десяткова, 1000011 - двійкова, 43 - шістнадцяткова, 103 - вісімкова відповідно).

У підсумку, для кращого розуміння про бінарні числа перегляньте відео (англ., укр. субтитри ), в якому José Américo N L F de Freitas чітко пояснює як працює бінарний код.

Перетворення додатних цілих чисел

Візьмемо, для прикладу, число 4321. У різних системах числення це число записується по-різному.

Запис числа 4321 у різних системах числення
Запис числа 4321 у різних системах числення

Давайте практично з’ясуємо, як перетворювати цілі числа з однієї системи числення в іншу.

Двійкове число

у 3-й системі числення

Розглянемо дванадцятизначне двійкове число і його трійковий еквівалент

Двійкове число    Трійковий еквівалент
101111010101      11011012

Спочатку переведемо двійкове число у його десятковий еквівалент ось так

1011110101012 = 1 · 211 + 0 · 210 + 1 · 29 + 1 · 28 + 1 · 27 + 1 · 26 + 0 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 2048 + 0 + 512 + 256 + 128 + 64 + 0 + 16 + 0 + 4 + 0 + 1 = 302910

Отримали десяткове число: 302910.

Переведемо число 302910 у трійкове діленням числа націло на основу трійкової системи (3)

Переведення десяткового числа у трійкове
Переведення десяткового числа 302910 у трійкове

Отримали трійкове число: 302910 = 110110123.

Остаточний результат: 1011110101012 = 110110123.

у 8-й системі числення

Розглянемо наступне дванадцятизначне двійкове число і його вісімковий еквівалент

Двійкове число    Вісімковий еквівалент
100111010001      4721

Спочатку переведемо двійкове число у його десятковий еквівалент ось так

1001110100012 = 1 · 211 + 0 · 210 + 0 · 29 + 1 · 28 + 1 · 27 + 1 · 26 + 0 · 25 + 1 · 24 + 0 · 23 + 0 · 22 + 0 · 21 + 1 · 20 = 2048 + 0 + 0 + 256 + 128 + 64 + 0 + 16 + 0 + 0 + 0 + 1 = 251310

Отримали десяткове число: 251310.

Переведемо число 251310 у вісімкове діленням числа націло на основу вісімкової системи (8)

Переведення десяткового числа у вісімкове
Переведення десяткового числа 251310 у вісімкове

Отримали вісімкове число: 251310 = 47218.

Остаточний результат: 1001110100012 = 47218.

Двійкове число легко перетворити у вісімкове, розділивши двійкове число на групи по три біта в кожній і потім записати під цими групами відповідні цифри вісімкового еквівалента у такий спосіб

100    111    010    001
4      7      2      1

у 10-й системі числення

Для перетворення числа з будь-якої системи в десяткову необхідно помножити кожну цифру числа на десятковий еквівалент її позиційного значення і всі результати підсумувати.

Для прикладу, поглянемо, як двійкове число 11010112 перетворюється у десяткове 10710.

Таблиця "Перетворення двійкового числа в десяткове"

Позиційне значення

64

32

16

8

4

2

1

Символьне значення

1

1

0

1

0

1

1

Множення

1 * 64 = 64

1 * 32 = 32

0 * 16 = 0

1 * 8 = 8

0 * 4 = 0

1 * 2 = 2

1 * 1 = 1

Сума

= 64 + 32 + 0 + 8 + 0 + 2 + 1 = 10710

11010112 = 1 · 26 + 1 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 1 · 20 = 64 + 32 + 0 + 8 + 0 + 2 + 1 = 10710

у 16-й системі числення

Розглянемо наступне дванадцятизначне двійкове число і його шістнадцятковий еквівалент

Двійкове число    Шістнадцятковий еквівалент
100111010001      9D1

Спочатку переведемо двійкове число у його десятковий еквівалент ось так

1001110100012 = 1 · 211 + 0 · 210 + 0 · 29 + 1 · 28 + 1 · 27 + 1 · 26 + 0 · 25 + 1 · 24 + 0 · 23 + 0 · 22 + 0 · 21 + 1 · 20 = 2048 + 0 + 0 + 256 + 128 + 64 + 0 + 16 + 0 + 0 + 0 + 1 = 251310

Отримали десяткове число: 251310.

Переведемо число 251310 у шістнадцяткове діленням числа націло на основу шістнадцяткової системи (16)

Переведення десяткового числа у шістнадцяткове
Переведення десяткового числа 251310 у шістнадцяткове

Отримали шістнадцяткове число: 251310 = 9D116.

Остаточний результат: 1001110100012 = 9D116.

Прослідковується закономірність перетворення числа з двійкової системи в шістнадцяткову. А саме, необхідно розділити двійкове число на групи по чотири біта в кожній і потім записати під цими групами відповідні цифри шістнадцяткового еквівалента, як це зроблено нижче

1001   1101   0001
9      D      1

Трійкове число

у 2-й системі числення

Переведемо трійкове число 12123 у його десятковий еквівалент ось так

12123 = 1 · 33 + 2 · 32 + 1 · 31 + 2 · 30 = 27 + 18 + 3 + 2 = 5010

Отримали десяткове число: 5010.

Переведемо число 5010 у двійкове діленням числа націло на основу двійкової системи (2)

Переведення десяткового числа у двійкове
Переведення десяткового числа 5010 у двійкове

Отримали двійкове число: 5010 = 1100102.

Остаточний результат: 12123 = 1100102.

у 8-й системі числення

Переведемо трійкове число 1212123 у його десятковий еквівалент ось так

1212123 = 1 · 35 + 2 · 34 + 1 · 33 + 2 · 32 + 1 · 31 + 2 · 30 = 243 + 162 + 27 + 18 + 3 + 2 = 45510

Отримали десяткове число: 45510.

Переведемо число 45510 у вісімкове діленням числа націло на основу вісімкової системи (8)

Переведення десяткового числа у вісімкове
Переведення десяткового числа 45510 у вісімкове

Отримали вісімкове число: 45510 = 7078.

Остаточний результат: 1212123 = 7078.

у 10-й системі числення

Для перетворення числа з будь-якої системи в десяткову необхідно помножити кожну цифру числа на десятковий еквівалент її позиційного значення і всі результати підсумувати.

Для прикладу, поглянемо, як трійкове число 1203 перетворюється у десяткове 1510.

Таблиця "Перетворення трійкового числа в десяткове"

Позиційне значення

9

3

1

Символьне значення

1

2

0

Множення

1 * 9 = 9

2 * 3 = 6

0 * 1 = 0

Сума

= 9 + 6 + 0 = 1510

1203 = 1 · 32 + 2 · 31 + 0 · 30 = 9 + 6 + 0 = 1510

Остаточний результат: 1203 = 1510.

у 16-й системі числення

Переведемо трійкове число 20213 у шістнадцяткову систему числення. Спочатку перетворимо число у його десятковий еквівалент ось так

20213 = 2 · 33 + 0 · 32 + 2 · 31 + 1 · 30 = 54 + 0 + 6 + 1 = 6110

Отримали десяткове число: 6110.

Переведемо число 6110 у шістнадцяткове діленням числа націло на основу шістнадцяткової системи (16)

Переведення десяткового числа у шістнадцяткове
Переведення десяткового числа 6110 у шістнадцяткове

Отримали шістнадцяткове число: 6110 = 3D16.

Остаточний результат: 20213 = 3D16.

Вісімкове число

у 2-й системі числення

Наприклад, є число 7258 у вісімковій системі числення і необхідно перевести його у двійкову. Переведемо число спочатку в десяткову ось так

7258 = 7 · 82 + 2 · 81 + 5 · 80 = 448 + 16 + 5 = 46910

Отримали десяткове число: 46910.

Переведемо число 46910 у двійкову систему числення діленням числа націло на снову двійкової системи (2)

Переведення десяткового числа у двійкове
Переведення десяткового числа 46910 у двійкове

Отримали двійкове число: 46910 = 1110101012.

Остаточний результат: 7258 = 1110101012.

Вісімкове число 725 також перекладається у двійкове шляхом простого запису 7 як його тризначного двійкового еквівалента 111, 2 - як 3-значного двійкового еквівалента 010, 5 - як 101, так що в цілому число записується у вигляді 9-значного двійкового числа 111010101

111   010   101
7     2     5

у 3-й системі числення

Наприклад, є число 1578 у вісімковій системі числення і необхідно перевести його у трійкову. Переведемо число спочатку в десяткову ось так

1578 = 1 · 82 + 5 · 81 + 7 · 80 = 64 + 40 + 7 = 11110

Отримали десяткове число: 11110.

Переведемо число 11110 у трійкову систему числення діленням числа націло на снову трійкової системи (3)

Переведення десяткового числа у трійкове
Переведення десяткового числа 11110 у трійкове

Отримали трійкове число: 11110 = 110103.

Остаточний результат: 1578 = 110103.

у 10-й системі числення

Для прикладу, перетворимо вісімкове число 73218 у десяткове 379310.

Таблиця "Перетворення вісімкового числа в десяткове"

Позиційне значення

512

64

8

1

Символьне значення

7

3

2

1

Множення

7 * 512 = 3584

3 * 64 = 192

2 * 8 = 16

1 * 1 = 1

Сума

= 3584 + 192 + 16 + 1 = 379310

73218 = 7 · 83 + 3 · 82 + 2 · 81 + 1 · 80 = 3584 + 192 + 16 + 1 = 379310

у 16-й системі числення

Наприклад, число 7258 у вісімковій системі числення необхідно перевести у шістнадцяткову. Для цього переведемо його спочатку в десяткову ось так

7258 = 7 · 82 + 2 · 81 + 5 · 80 = 448 + 16 + 5 = 46910

Далі, переведемо 46910 в шістнадцяткову діленням числа націло на основу шістнадцяткової системи (16)

Переведення десяткового числа у шістнадцяткове
Переведення десяткового числа 46910 у шістнадцяткове

Остаточний результат: 7258 = 1D516.

Десяткове число

у 2-й системі числення

Переведемо число 4510 у двійкове діленням числа націло на основу двійкової системи (2)

Переведення десяткового числа у двійкове
Переведення десяткового числа 4510 у двійкове

Остаточний результат: 4510 = 1011012.

у 3-й системі числення

Переведемо число 4510 у трійкове діленням числа націло на основу трійкової системи (3)

Переведення десяткового числа у трійкове
Переведення десяткового числа 4510 у трійкове

Остаточний результат: 4510 = 12003.

у 8-й системі числення

Переведемо число 4510 у вісімкове діленням числа націло на основу вісімкової системи (8)

Переведення десяткового числа у вісімкове
Переведення десяткового числа 4510 у вісімкове

Остаточний результат: 4510 = 558.

у 16-й системі числення

Переведемо число 4510 у шістнадцякове діленням числа націло на основу шістнадцяткової системи (16)

Переведення десяткового числа у шістнадцяткове
Переведення десяткового числа 4510 у шістнадцяткове

Остаточний результат: 4510 = 2D16.

Шістнадцяткове число

у 2-й системі числення

Наприклад, число F3A16 у шістнадцятковій системі числення необхідно перевести у двійкову. Для цього переведемо його спочатку в десяткову ось так

F3A16 = 15 · 162 + 3 · 161 + 10 · 160 = 3840 + 48 + 10 = 389810

Переведемо 389810 у двійкову систему діленням числа націло на снову двійкової системи (2):

Переведення десяткового числа у двійкове
Переведення десяткового числа 389810 у двійкове

Отримали двійкове число: 389810 = 1111001110102.

Остаточний результат: F3A16 = 1111001110102.

Шістнадцяткове число F3A також перетворюється в двійкове за допомогою запису F як 4-значного двійкового еквівалента 1111, числа 3 як двійкового 0011, числа A як 1010, що дає 12-значне число 111100111010

1111   0011   1010
F      3      A

у 3-й системі числення

Перетворимо число FA16 у шістнадцятковій системі числення у трійкову. Для цього переведемо його спочатку в десяткову ось так

FA16 = 15 · 161 + 10 · 160 = 240 + 10 = 25010

Переведемо 25010 у трійкову систему діленням числа націло на снову трійкової системи (3):

Переведення десяткового числа у трійкове
Переведення десяткового числа 25010 у трійкове

Отримали трійкове число: 25010 = 1000213.

Остаточний результат: FA16 = 1000213.

у 8-й системі числення

Наприклад, число F3A16 у шістнадцятковій системі числення необхідно перевести у вісімкову. Для цього переведемо його спочатку в десяткову ось так

F3A16 = 15 · 162 + 3 · 161 + 10 · 160 = 3840 + 48 + 10 = 389810

Переведемо 389810 у вісімкову систему діленням числа націло на снову вісімкової системи (8)

Переведення десяткового числа у вісімкове
Переведення десяткового числа 389810 у вісімкове

Остаточний результат: F3A16 = 74728.

у 10-й системі числення

Для прикладу, число CD3B16 перетворюється у десяткове 5253910.

Таблиця "Перетворення шістнадцяткового числа в десяткове"

Позиційне значення

4096

256

16

1

Символьне значення

C

D

3

B

Множення

C * 4096 = 49152

D * 256 = 3328

3 * 16 = 48

B * 1 = 11

Сума

= 49152 + 3328 + 48 + 11 = 5253910

CD3B16 = 12 · 163 + 13 · 162 + 3 · 161 + 11 · 160 = 49152 + 3328 + 48 + 11 = 5253910

Конвертер систем числення на Python

Про створення і представлення цілих чисел і чисел з плаваючою крапкою у мові програмування Python читайте в Додаток B. Числа в Python.

Для перетворень між основними системами числення можна також використовувати застосунок Конвертер систем числення Римська-2-3-8-10-16.

Застосунок написаний на мові Python з використанням графічної бібліотеки інтерфейсів tkinter . Для користувачів Windows та Linux.

Завантажити файл-архів із застосунком можна за допомогою .

Файл-архів захищений паролем, який можна отримати, написавши на електронну адресу gtmizyuk@gmail.com.

Вимоги до використання

Встановлений інтерпретатор Python версії 3.6+.

Запуск застосунку

Для запуску застосунку виконайте такі кроки:

  1. Відкрити вікно термінала (Ctrl+Alt+T для Linux; Win+R, cmd для Windows).

  2. Перейти в терміналі у каталог/папку з розархівованим застосунком.

  3. Виконати команду python numeralconverter.py.

Використання застосунку

Скріншот

Переведення числа з 8-ї системи числення у 3-ву
Переведення числа з 8-ї системи числення у 3-ву

Відео

Основні можливості застосунку можна переглянути у відео.

Перетворення додатних дробових чисел

Цілу і дробову частини, у записі дробового числа, завичай, розділяють символом «коми». Далі, в записі дробових чисел, будемо дотримуватися такого позначення, пам’ятаючи, що в комп’ютерних системах для цих речей використовується розділювач «крапка».
Якщо необхідно перевести в деяку систему числення дробове число, в якому присутня і ціла, і дробова частини, ці частини перетворюють окремо, а потім об’єднують. В результуючому записі ціла частина відділяється від дробової «комою» («крапкою»).

Десятковий дріб

Для початку, наведемо алгоритм перетворення десяткового дробового числа в систему числення з основою q:

  1. Помножити вхідне число на основу системи числення q, в яку відбувається перетворення. Отримана, в результаті множення, ціла частина є першою цифрою після крапки в шуканому числі.

  2. Якщо дробова частина після множення не дорівнює 0, помножити її на q, потім цілу частину отриманого числа замінити на цифру в системі q і дописати її праворуч до результату.

  3. Виконати пункт 2 до тих пір, доки дробова частина не стане дорівнювати нулю або дробова частина виявиться рівною вже раніше обчисленій дробовій частині.

у 2-й системі числення

Застосуємо поданий алгоритм для перетворення десяткового дробового числа 0,187510 у двійкову систему числення і заповнимо таблицю:

Таблиця "Перетворення дробового числа 0,187510 у двійкову систему числення"
Обчислення Ціла частина Дробова частина

0,1875 · 2 = 0,375

0 (перша цифра після коми)

0,375

0,375 · 2 = 0,75

0 (друга цифра після коми)

0,75

0,75 · 2 = 1,5

1 (третя цифра після коми)

0,5

0,5 · 2 = 1

1 (четверта цифра після коми)

0

Обчислення (множення на основу системи числення, в яку перетворюють вхідне число) закінчуються, коли дробова частина результату (третій стовпчик таблиці) дорівнює нулю.

Ціла частина числа вже у двійковій системі числення залишається такою ж самою (0,), як і у десятковій системі, а дробова частина числа вже у двійковій системі числення буде складатися з цілих частин (другий стовпчик таблиці) в порядку виконання обчислень:

0,187510 = 0,00112
При перетворенні скінченних дробів у деяку систему числення q можна отримати скінченний дріб в системі q або нескінченний періодичний дріб. В другому випадку, зазвичай, вказують кількість значущих цифр (наближення) і округлюють число відповідним чином.

Тепер розглянемо, як зберігаються в пам’яті комп’ютера десяткове дробове число 0,3, записавши його в двійковій системі числення.

Таблиця "Перетворення дробового числа 0,310 у двійкову систему числення"
Обчислення Ціла частина Дробова частина

0,3 · 2 = 0,6

0 (перша цифра після коми)

0,6

0,6 · 2 = 1,2

1 (друга цифра після коми)

0,2

0,2 · 2 = 0,4

0 (третя цифра після коми)

0,4

0,4 · 2 = 0,8

0 (четверта цифра після коми)

0,8

0,8 · 2 = 1,6

1 (п’ята цифра після коми)

0,6

Дробова частина останнього добутку дорівнює дробовій частині, яка вже була обчислена раніше (0,6), як наслідок, усі наступні цифри після першої появи цього дробового значення утворюють період дробового числа:

0,310 = 0,0(1001)2

Це означає, що для зберігання десяткового числа 0,3 в двійковій системі числення необхідно нескінченне число розрядів. Оскільки реальний комп’ютер не може мати нескінченну пам’ять, то число 0,3 в двійковому вигляді зберігається в пам’яті з певним наближенням.

Зберігання дробових чисел в пам’яті комп’ютера

Дробові числа в пам’яті комп’ютера подаються як дроби у двійковій системі числення, тобто, з основою 2 (двійкові дроби).

Більшість дробових чисел не можуть бути точно представлені у двійковому записі. Наслідком цього є те, що, як правило, десяткові дробові числа лише наближені до дробових двійкових чисел, які фактично зберігаються в пам’яті комп’ютера.

Спробуйте уявити частку 1/3 в десятковій формі і ви помітите, що число насправді не матиме кінця у поданні з основою 10. Незалежно від того, скільки цифр ви запишите (0,3, 0,33, 0,333, ․․․), результат ніколи не буде дорівнювати 1/3, але буде з кожною цифрою все кращим наближенням до 1/3.

Аналогічно, деякі дробові числа, такі як 0,1 або 1/10, не мають кінця у двійковому поданні. Незалежно від того, скільки цифр ви запишите у двійковому поданні, десяткове значення 0,1 не може бути точно представлено саме як дріб з основою 2. У поданні з основою 2 число 1/10 - нескінченний періодичний дріб:

0,0001100110011001100110011001100110011001100110011…​

Зупинившись на будь-якому кінцевому числі біт ви отримаєте значення числа, але з певним наближенням. Тому, при виконанні обчислень з дробовими числами, ці наближення можуть істотно впливати на результат.

у будь-якій системі числення

Розглянемо ще кілька прикладів. Перетворимо десяткове дробове число 0,187510 в інші системи числення.

Таблиця "Перетворення дробового числа 0,187510 у 8-ву систему числення"
Обчислення Ціла частина Дробова частина

0,1875 · 8 = 0,5

1 (перша цифра після коми)

0,5

0,5 · 8 = 4

4 (друга цифра після коми)

0

Результат:

0,187510 = 0,148
Таблиця "Перетворення дробового числа 0,187510 у 16-ву систему числення"
Обчислення Ціла частина Дробова частина

0,1875 · 16 = 3

3 (перша цифра після коми)

0

Результат:

0,187510 = 0,316

Переведемо десяткове дробове число 0,235610 в систему числення з основою 5.

Таблиця "Перетворення дробового числа 0,235610 у 5-ву систему числення"
Обчислення Ціла частина Дробова частина

0,2356 · 5 = 1,178

1 (перша цифра після коми)

0,178

0,178 · 5 = 0,89

0 (друга цифра після коми)

0,89

0,89 · 5 = 4,45

4 (третя цифра після коми)

0,45

0,45 · 5 = 2,25

2 (четверта цифра після коми)

0,25

0,25 · 5 = 1,25

1 (п’ята цифра після коми)

0,25

Дробова частина останнього добутку дорівнює дробовій частині, яка вже була обчислена раніше (0,25), як наслідок, усі наступні цифри після першої появи цього дробового значення утворюють період дробового числа:

0,235610 = 0,10421111111…​5 = 0,1042(1)5

Виконаємо ще одне перетворення, на цей раз дробового числа, що містить як дробову, так і цілу частини, з десяткової системи числення в інші системи.

Візьмемо десяткове дробове число 78,52310 і перетворимо його у вісімкову систему числення, залишивши чотири знаки в дробовій частині нового числа, і у шістнадцяткову - залишивши три знаки в дробовій частині нового числа.

Запишемо вхідне число як суму двох частин - цілої і дробової

78,52310 = 7810 + 0,52310

і виконаємо перетворення для кожної з них.

Для перетворення цілої частини числа 78,52310 у вісімкову систему числення, поділимо цілу частину числа на основу вісімкової системи

Перетворення цілої частини десяткового дробового числа `78,523~10~` у вісімкову систему числення
Перетворення цілої частини десяткового дробового числа 78,52310 у вісімкову систему числення

В результаті отримаємо значення

7810 = 1168

Виконаємо перетворення дробової частини числа 78,52310 у вісімкову систему числення.

Таблиця "Перетворення дробової частини десяткового дробового числа 78,52310 у 8-ву систему числення"
Обчислення Ціла частина Дробова частина

0,523 · 8 = 4,184

4 (перша цифра після коми)

0,184

0,184 · 8 = 1,472

1 (друга цифра після коми)

0,472

0,472 · 8 = 3,776

3 (третя цифра після коми)

0,776

0,776 · 8 = 6,208

6 (четверта цифра після коми)

0,208

0,208 · 8 = 1,664

1 (п’ята цифра після коми)

0,664

0,664 · 8 = 5,312

5 (шоста цифра після коми)

0,312

...

...

...

В результаті обчислень, значення дробової частини нового числа у вісімковій системі числення буде таким:

0,52310 = 0,413615…​8

Врахувавши умову, за якою необхідно залишити чотири знаки в дробовій частині нового числа, отримаємо:

0,52310 = 0,41368

Склавши цілу і дробову частину, запишемо значення десяткового дробового числа 78,52310 у 8-ій системі числення:

78,52310 = 116,41368

Для перетворення цілої частини числа 78,52310 у шістнадцяткову систему числення, поділимо цілу частину числа на основу шістнадцяткової системи

Перетворення цілої частини десяткового дробового числа `78,523~10~` у шістнадцяткову систему числення
Перетворення цілої частини десяткового дробового числа 78,52310 у шістнадцяткову систему числення

В результаті отримаємо значення

7810 = 4E16

Виконаємо перетворення дробової частини числа 78,52310 у шістнадцяткову систему числення.

Таблиця "Перетворення дробової частини десяткового дробового числа 78,52310 у 16-ву систему числення"
Обчислення Ціла частина Дробова частина

0,523 · 16 = 8,368

8 (перша цифра після коми)

0,368

0,368 · 16 = 5,888

5 (друга цифра після коми)

0,888

0,888 · 16 = 14,208

14 (третя цифра після коми)

0,208

0,208 · 16 = 3,328

3 (четверта цифра після коми)

0,328

0,328 · 16 = 5,248

5 (п’ята цифра після коми)

0,248

0,248 · 16 = 3,968

3 (шоста цифра після коми)

0,968

0,968 · 16 = 15,488

15 (сьома цифра після коми)

0,488

0,488 · 16 = 7,808

7 (восьма цифра після коми)

0,808

...

...

...

В результаті обчислень, значення дробової частини нового числа у шістнадцятковій системі числення буде таким:

0,52310 = 0,85E353F7…​16

Врахувавши умову, за якою необхідно залишити три знаки в дробовій частині нового числа, отримаємо:

0,52310 = 0,85E16

Склавши цілу і дробову частину, запишемо значення десяткового дробового числа 78,52310 у 16-ій системі числення:

78,52310 = 4E,85E16

Двійковий дріб

у 10-й системі числення

Запишемо значення скінченного двійкового дробу 0,110112 в десятковій системі числення. Для цього скористаємось розгорнутою формою запису числа:

0,110112 = 0 · 20 + 1 · 2-1 + 1 · 2-2 + 0 · 2-3 + 1 · 2-4 + 1 · 2-5 = 0 + 0,5 + 0,25 + 0 + 0,0625 + 0,03125 = 0,8437510

у будь-якій системі числення

Щоб перетворити двійкове дробове число в систему з основою q (окрім десяткової), необхідно спочатку перетворити двійкове число в десяткову систему, а потім вже десяткове число перетворити в систему q. Зробимо це.

Візьмемо двійкове дробове число 0,01012 і перетворимо, наприклад, в шістнадцяткову систему числення. Отже, спочатку перетворимо число 0,01012 в десяткову систему, використовуючи розгорнуту форму запису числа:

0,01012 = 0 · 20 + 0 · 2-1 + 1 · 2-2 + 0 · 2-3 + 1 · 2-4 = 0 + 0 + 0,25 + 0 + 0,0625 = 0,312510

Далі, ціла частина нового числа буде дорівнювати 016, а дробову частину нового числа знаходимо множенням дробової частини двійкового дробового числа на основу 16:

Таблиця "Перетворення дробового десяткового числа 0,312510 у шістнадцяткову систему числення"
Обчислення Ціла частина Дробова частина

0,3125 · 16 = 5

5 (перша цифра після коми)

0

Отже, в результаті:

0,312510 = 0,516

Додаючи цілу і дробову частини, отримуємо потрібне значення в шістнадцятковій системі:

016 + 0,516 = 0,516

Спробуємо перетворити двійкові дробові числа в інші системи числення, використовуючи інший спосіб, що описується наступним алгоритмом.

Щоб записати дробове двійкове число в системі числення q, необхідно:

  1. Цілу і дробову частини двійкового числа, починаючи з крапки (коми), розбити на групи по n цифр в кожній.

  2. Якщо в останніх правої і лівої групах буде менше n розрядів, то необхідно доповнити, відповідно, справа і зліва нулями до потрібного числа розрядів.

  3. Розглянути кожну з груп як n-розрядне двійкове число і записати його відповідною цифрою в системі числення з основою q.

Наприклад, перетворимо число 1011101,101112 в шістнадцяткову систему числення.

Розіб’ємо цілу і дробову частини числа по чотири групи двійкових цифр вліво і вправо від коми відповідно, записавши нулі там, де знаків менше чотирьох (для цілої частини додаємо нулі зліва, для дробової частини додаємо нулі справа):

0101 1101, 1011 1000

Використаємо шістнадцятково-двійкову таблицю, в якій зберігаються шістнадцяткові цифри та їхні двійкові еквіваленти, окрім того, усі двійкові числа записані в чотирьохзначному вигляді (там, де знаків менше чотирьох, зліва додані нулі):

Таблиця "Шістнадцятково-двійкова таблиця"
16 2 16 2

0

0000

8

1000

1

0001

9

1001

2

0010

A

1010

3

0011

B

1011

4

0100

C

1100

5

0101

D

1101

6

0110

E

1110

7

0111

F

1111

В результаті

1011101,101112 = 5D,B816

Аналогічно використаємо вісімково-двійкову таблицю для перетворення числа 1011101,101112 у вісімкову систему числення. У цій таблиці кожній вісімковій цифрі відповідає трійка двійкових цифр.

Таблиця "Вісімково-двійкова таблиця"
8 2

0

000

1

001

2

010

3

011

4

100

5

101

6

110

7

111

Розіб’ємо число по три двійкових знаки від коми вліво і вправо відповідно (там, де знаків менше трьох, для цілої частини додаємо нулі зліва, для дробової частини додаємо нулі справа).

001 011 101, 101 110

В результаті

1011101,101112 = 135,568

Дріб у будь-якій системі числення

у 10-й системі числення

Продемонструємо, як можна перетворити скінченне дробове число, записане в деякій системі числення з основою q в десяткову систему числення.

Перетворимо дробове скінченне число 0,E16 в десяткову систему числення. Для цього використаємо розгорнуту форму запису числа:

0,E16 = 0 · 160 + 14 · 16-1 = 0 + 0,875 = 0,87510

Таблиця переведення дробових чисел

Для демонстрації процесу переведення додатних дробових чисел з однієї системи числення у іншу можна використати таблицю переведення Дробові числа. В окремому випадку, таблицю можна також використовувати для переведення з однієї системи числення у іншу додатних цілих чисел.

При використанні електронної таблиці Дробові числа, результати перетворень (обчислень) для різної точності (кількість значущих цифр у числі) можуть відрізнятися.

Використання онлайн-сервісів

Для перетворень між різними системами числення можна використовувати різні онлайн-калькулятори, на зразок таких:

Задачі для самостійного виконання

Непозиційні системи числення

  1. Яке найбільше число можна записати в класичній Римській системі числення?

  2. Які десяткові числа записані за допомогою римських цифр: MMMD, MCCVII, MCMXCVIII?

  3. Перетворіть в римську систему десяткові числа: 15, 234, 1999, 2666, 3888.

  4. Перетворіть в десяткову систему римські числа: MMMCXI, MCMXCIX, MCXCVII, MMDCCCLXXXIX.

  5. Яку значення позначає цифра 8 в десяткових числах 3538, 8126, 81 і 891?

  6. Що можна сказати про числа 111 і III?

Позиційні системи числення і основні поняття систем числення

  1. Запишіть алфавіти для таких систем числення: 5, 7, 11.

  2. Яке найменше значення основи повинно бути у системах числення, щоб в них існували числа: 123, 145, 112 і 567?

  3. Яке найменше значення основи повинно бути у системах числення, щоб в них існували числа: 22, 896, 1100 і A007?

  4. Запишіть в розгорнутій формі числа: 115,2310, 0,4568, E4B,1216.

  5. Запишіть за допомогою схеми Горнера числа: 2644110, 44558, 92D16.

  6. Знайдіть всі основи систем числення, в яких запис числа 39 закінчується на 6.

  7. В системі числення з деякою основою x десяткове число 55 записується у вигляді 1004x. Яка основа системи числення?

  8. Запис числа 55 в системі числення з деякою основою x виглядає так: 212x. Вкажіть основу системи числення.

  9. Знайдіть всі основи систем числення, в яких запис числа 30 закінчується на 8.

  10. Знайдіть найменшу основу системи числення, в якій запис числа 30 є тризначним.

  11. Знайдіть усі десяткові числа, які не більші 25, запис яких в системі числення з основою 5 закінчується на 3.

  12. Знайдіть усі десяткові числа, які не більші 30, запис яких в системі числення з основою 6 починається на 4.

  13. Знайдіть усі десяткові числа, які не більші 25, запис яких в системі числення з основою 8 закінчується на 6.

  14. Знайдіть усі десяткові числа, які не більші 30, запис яких в системі числення з основою 7 починається на 5.

  15. Всі 5-літерні слова, складені з букв A, M, R, S, записані в алфавітному порядку у список:

1. AAAAA
2. AAAAM
3. AAAAR
4. AAAAS
…​
  • визначте, скільки всього слів у списку;

  • вкажіть слова, які розташовані на 150-му, 250-му, 350-му і 450-му місці;

  • вкажіть порядкові номери слів: MARS, SARM, ARSM;

  • вкажіть номери першого і останнього слів, які починаються з літери M.

Бінарні числа

  1. Які символи таблиці ASCII мають коди 50 і 81?

  2. Скільки бітів пам’яті комп’ютера займає словосполучення computer science в 16-бітномму кодування Unicode?

  3. Яке слово зашифровано послідовністю десяткових кодів 116 101 97 99 104 101 114 в кодуванні ASCII?

  4. За допомогою послідовності десяткових кодів зашифровано слова computer. Яка послідовність десяткових кодів відповідатиме цьому ж слову, записаному великими літерами?

  5. За шістнадцятковим кодом 50 79 74 68 6F 6E відновіть десятковий код і, користуючись таблицею кодування символів, розшифруйте слово.

  6. Довжина двійкового коду тексту, набраного на комп’ютері з використанням кодування Unicode - 4 кБ. Визначте кількість символів у тексті.

  7. Автоматичний пристрій здійснив перекодування інформаційного повідомлення українською мовою, спочатку записаного в 16-бітному коді Unicode, у 8-бітне кодування Windows-1251, при цьому довжина двійкового коду повідомлення становила 60 байт. Визначте довжину двійкового коду повідомлення до перекодування.

  8. Яке мінімальне число біт на символ потрібно виділити в пам’яті, якщо необхідно використовувати не менше 10 символів одночасно?

  9. Скільки різних символів можна використовувати за умови, що на кожний символ відводиться 9 біт?

  10. При перекодуванні повідомлення українською мовою із 16-бітного коду Unicode в 8-бітне кодування KOI8-U, воно зменшилось на 560 бітів. Яка довжина повідомлення у символах?

  11. При перекодуванні повідомлення із 8-бітного коду в 16-бітне кодування Unicode, його об’єм збільшився на 2048 байтів. Який інформаційний об’єм повідомлення до перекодування (у байтах)?

  12. Визначте, не використовуючи таблицю кодування ASCII, десятковий ASCII-код символу y, якщо відомі наступні коди: A - 65, Y - 89, a - 97.

  13. Оцініть інформаційний об’єм (в кілобайтах) тексту, що складається із 40 сторінок, якщо на кожній сторінці розміщується в середньому 32 рядки по 60 символів в рядку (включаючи пропуски). Текст закодований у 8-бітному кодуванні.

Перетворення чисел

  1. Виберіть найбільше число: 102, 108, 1010, 1012, 1016, 1022.

  2. Запишіть в десятковій системі числення числа: 3338, 3339, 33316.

  3. Перетворіть шістнадцяткове число AE в двійкове.

  4. Перетворіть вісімкове число 7241 в двійкове.

  5. Перетворіть шістнадцяткове число 2FBC в вісімкове.

  6. Перетворіть двійкове число 1001111 в десяткове.

  7. Перетворіть вісімкове число 503 в десяткове.

  8. Перетворіть шістнадцяткове число EFD2 в десяткове.

  9. Перетворіть десяткове число 123 в двійкове, вісімкове і шістнадцяткове.

  10. Перетворіть десяткові числа 37 і 315 у вісімкові і шістнадцяткові.

  11. Вкажіть двійкове подання десяткового числа 345.

  12. Перетворіть числа 101111001, 10101010, 1000001 у вісімкову, десяткову і шістнадцяткову системи числення.

  13. Перетворіть двійкове число 110101011010 у вісімкове і шістнадцяткове представлення.

  14. Перетворіть числа: 2416 в двійкове, AC616 у вісімкове, F1616 у десяткове.

  15. Перетворіть числа: 101001012 в десяткове, 168 в двійкове, 202110 в шістнадцяткове.

  16. Перевести цілі числа із десяткової системи числення в двійкову систему: 24, 124, 243, 5243.

  17. Перевести цілі числа із десяткової системи числення у вісімкову систему: 519, 312, 58, 742.

  18. Перевести цілі двійкові числа у вісімкову систему: 1100001101011, 101, 10000000001, 101011.

  19. Перевести цілі двійкові числа у шістнадцяткову систему: 1100101, 10111, 1010101, 11111111.

  20. Перевести цілі вісімкові числа у двійкову систему: 256, 171, 652.

  21. Перевести цілі шістнадцяткові числа у двійкову систему: 1AC5, FFAA, BC5.

  22. Перевести цілі шістнадцяткові числа у вісімкову систему: A25, 84B, D125.

  23. Перевести цілі вісімкові числа у шістнадцяткову систему: 352, 772, 665.

  24. В яких системах числення справедливі такі рівності: 2 · 2 = 10, 2 · 3 = 11, 3 · 3 = 13?

  25. Скільки разів зустрічається цифра 3 в записі числел 21, 22, 23, ..., 30, 31 в системі числення з основою 7?

  26. В системі числення з деякою основою x число 12 записується у вигляді 110x. Яка основа системи числення?

  27. Яке число слідує за числом 11414 у 14 системі числення?

  28. Яке число знаходиться перед числом 1018 у 18 системі числення?

  29. Яке з чисел більше: 510 чи 105, 10002 чи 108?

  30. Запишіть в десятковій системі числення числа: 34,15, 2213, 1157, ABC16.

  31. В яких системах числення 10 - число непарне?

  32. Запишіть десяткові числа у діапазоні від 20 до 30 включно у двійковій, вісімковій і шастнадцятковій системах числення.

  33. У скільки разів збільшиться число 324, якщо справа до нього дописати три нулі?

  34. Запишіть десяткові еквіваленти числа 101010, якщо вважати, що число записане у всіх системах числення - від двійкової до десяткової включно.

  35. Перетворіть десяткові дроби у двійкову систему числення: 0,655, 0,6134, 0,333, 0,9412. В двійковому записі зберегти шість знаків.

  36. Перетворіть десяткові дроби у шістнадцяткову систему числення: 0,547, 0,1011, 0,1234, 0,8899. В двійковому записі зберегти шість знаків.

  37. Перетворіть у вісімкову систему числення скінченне шістнадцяткове дробове число BF3,616.

  38. Перетворіть десяткові дроби 0,1, 0,3 і 0,8 в трійкову і вісімкову системи числення.

  39. Перетворіть десяткові числа 345, 0,125 і 45,65 у 12-ву систему числення.

  40. Перетворіть десяткові числа 675, 0,345 і 12,13 у 4-ву систему числення.

  41. Перетворіть десяткові числа 890, 0,345 і 1,3 у 7-ву систему числення.

  42. Перетворіть десяткові числа 625, 0,625 і 625,75 у 6-ву систему числення.

  43. Перетворіть десяткові числа 99, 0,805 і 508,99 у 8-ву систему числення.

  44. Перетворіть числа: 324 в двійкове, 15,26 в десяткове, 101,11012 в шістнадцяткове.

  45. Перетворіть числа: 1A1,1E16 в двійкове, 111,2223 в десяткове, 2738 в шістнадцяткове.

  46. Перевести вісімкові числа у двійкову систему: 0,231, 345,12, 67,35.

  47. Перевести шістнадцяткові числа у двійкову систему: 0,FDD, FDA,12F, DDFF,A.

  48. Перетворіть десяткові дроби у трійкову систему числення: 40,5, 90,99, 124,44, 225,52. В трійковому записі зберегти п’ять знаків.

  49. Перетворіть десяткові дробові числа 12,42, 112,241 і 25,81 в систему з основою 4. В записі числа зберегти три знаки.

  50. Перетворіть десяткові числа 11,8, 15,3 і 22,7 в двійкову систему, виділивши період в дробовій частині утворених чисел.

  51. Перетворіть дробові числа у вісімкову і шістнадцяткову системи числення: 100010,011101, 1111000000,101, 100001,111, 101111,011.

  52. Перетворіть двійкові числа у вісімкову систему числення: 0,1101, 0,111, 0,01, 0,11011011.

  53. Перетворіть двійкові числа у шістнадцяткову систему числення: 0,1001, 0,011011, 0,101001000, 0,11111111.

  54. Перетворіть двійкові числа у вісімкову систему числення: 10001,1001, 100,011011, 11,101, 101010,111.

  55. Перетворіть двійкові числа у шістнадцяткову систему числення: 1,101, 1000,0001, 111,111, 110011,1001.

  56. Перевести шістнадцяткові числа у вісімкову систему: 24A,9F, 21D,123, 0,DFD4.

  57. Перевести вісімкові числа у шістнадцяткову систему: 0,3438, 0,7645, 42,75.

  58. Перевести число 12345,6789 в 27-ву систему числення.

  59. Перевести число ABCD,EF16 у вісімкову систему числення.

Додаток A

  1. Визначити додатковий код десяткових чисел -1, -10,-52, -100 для восьмирозрядної і шістнадцятковорозрядної комірок пам’яті.

  2. Визначити подання десяткового цілого від’ємного числа -1501 у двійковій і шістнадцятковій формах.

  3. Запишіть дробові числа 0,006223, 1234,4567, 0,54 в нормалізованй формі з плаваючою крапкою в десятковій системі численя.

  4. Порівняйте числа:

318,478510 · 109 і 3,18478510 · 1011
218,478510 · 10-3 і 21847,8510 · 10-4
0,11012 · 22 і 1012 · 2-2
  1. Визначте, як зберігаються в 4-байтовій комірці пам’яті десяткові числа 100, -100, -0,1, 45,65, і отримайте їх шістнадцяткові коди.

  2. Визначте, яким десятковим числам, що зберігаються в 4-байтовій комірці пам’яті, відповідають шістнадцяткові коди: C981100016, BFC0000016, 3FC0000016.

  3. Які з чисел 4316, 1010102, 12910 і -13510 можна зберегти в одному байті (у восьмирозрядній комірці пам’яті)?

Додаток B

  1. Обчисліть і виведіть на екран:

22222
  1. Обчисліть 15! факторіал і виведіть результат.

  2. Обчисліть довжину гіпотенузи в прямокутному трикутнику зі сторонами 2021 і 1202.

  3. Число 2021 записали 100 раз поспіль. Отримане число піднесли до квадрату. Скільки вийшло?

  4. Запишіть слово Python 1000 разів поспіль. Надрукуйте утворений рядок.

  5. Використовуючи можливості мови програмування Python перетворіть числа у десяткову систему числення: 2268, 1203, 10111101011011101112, A1B216, 31034, FG19, 512521, 40826, 202934, 198136.

  6. Використовуючи можливості мови програмування Python перетворіть числа у десяткову систему числення: 0o14, 0b10101011010011, 0xD35C, 0o1234, 0xA9C, 0b1000110111.

  7. За допомогою рядкового форматування надрукуйте 56 знаків після десяткової крапки для таких чисел: 0,1, 0,3, 12,379, 3,66, 42,545.

  8. Перетворіть десяткові дробові числа в шістнадцяткову систему числення за допомогою Python: 0,1425, 5,34, 145,12.

  9. Перетворіть шістнадцяткове подання чисел з плаваючою крапкою у Python у десяткову систему числення: 0x1,30a3d70a3d70ap+3, 0x1,999999999999ap-2, '0x1,8000000000000p+0.

Словник основних понять

Додатковий код

використовують для подання в комп’ютері цілих від’ємних чисел, оскільки він дозволяє замінити арфиметичну дію віднімання дією додавання, що суттєво збільшує швидкість обчислень.

Експоненціальна форма запису числа

представлення дробових чисел у вигляді мантиси і порядку, зручний при представленні дуже великих і дуже малих чисел, а також для уніфікації їх написання.

Знаковий розряд

розряд для зберігання знаку числа.

Кодування інформації

переклад інформації, поданої повідомленням в якомусь первинному алфавіті, у послідовність інших символів (кодів).

Комп’ютерна арифметика

включає алгоритми виконання операцій над числами з плаваючою крапкою , дробами та дуже великими числами .

Літерал у мові програмування Python

спосіб створення об’єктів. Якщо в тексті коду зустрічається літерал, то для цього літералу створюється окремий об’єкт деякого типу, тобто, генерується відповідний код, що створює об’єкт, який містить значення цього літералу. Запис, наприклад, a = 5, можна прочитати як за допомогою числового літералу 5 створений цілочисельний об’єкт зі значенням 5 , на який посилається ім’я a . Інші приклади літералів:

3 # числовий літерал
2.48 # числовий літерал
"some text" # рядковий літерал
[3, 5, 7, 9] # літерал списку
{'a': 1, 'b': 2, 'c': 3} # літерал словника
Мантиса

дробова частина нормалізованого числа при використанні арифметики з плаваючою крапкою.

Натуральні числа

числа, що виникають природним чином при лічбі: 1, 2, 3, ... . Натуральні числа можна записувати за допомогою десяти цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.

Непозиційна система числення

система числення, в якій значення цифри у числі не залежить від позиції цієї цифри в записі числа.

Нескінченний періодичний десятковий дріб

число, яке не може бути точно виражене у вигляді десяткового дробу. Наприклад, при дробі 1/3 ми одержуємо 0,3333... - це нескінченний періодичний дріб з періодом 3, по іншому записують як 0,(3). Прикладом нескінченного неперіодичного числа є число π - 3,141592....

Нормалізована форма подання числа

подання числа в експоненціальній формі, де ціла частина мантиси складається із єдиної ненульової цифри. В цьому випадку, мантиса повинна задовільняти умову: 1 ≤ m < n, де m - мантиса, n - основа системи числення.

Основа системи числення

кількість знаків (цифр), які використовуються для запису числа.

Переповнення

пов’язане з обмеженою кількістю розрядів комірки пам’яті для зберігання числа, і не пов’язане із системою числення.

Позиційна система числення

система числення, в якій значення цифри залежить від позиції цифри у записі числа. В позиційних системах числення значення, яке позначене цифрою в числі, залежить від позиції цифри в записі числа, а в непозиційних - значення цифри у числі не залежить від позиції цієї цифри в записі числа.

Прямий код

форма подання числа, при якій старший розряд комірки пам’яті відводиться під знак, усі інші k-1 розрядів - під цифри числа.

Розгорнута форма запису числа

дозволяє записувати будь-яке ціле або дробове (подається як сума цілої і дробової частин, будь-яка з цих частин може бути відсутня) невід’ємне число в заданій позиційній системі числення. Для позначення від’ємного числа використовується знак -, після якого, за тими самими правилами, записується модуль числа. Схему Горнера і розгорнуту форму запису числа можна використовувати для перетворення числа із будь-якої системи числення в десяткову систему числення.

Розряд

позиція цифри у числі.

Розрядність

кількість цифр, з яких складається число. Наприклад, 125 - трирозрядне число, 01110011 - восьмирозрядне число. Розряди нумеруються справа наліво і рахунок починається з 0.

Система числення

правила запису чисел за допомогою спеціальних знаків - цифр, а також відповідні правила виконання дій з цими числами.

Скінченний десятковий дріб

число, яке може бути точно виражене у вигляді десяткового дробу. Наприклад, дріб 1/2 можна представити десятковим дробом 0,5.

Унарна система числення

цифрами такої системи можуть використовуватися будь-які однакові предмети або символи (камінці, вузлики, засічки на дереві тощо).

Формат з фіксованою крапкою

представлення дробового числа, що має фіксовану кількість цифр після відокремлювальної крапки.

Число з плаваючою крапкою

форма представлення дробових чисел, в якій число зберігається у формі мантиси і показника степеня.

Додаток A: Зберігання чисел в пам’яті комп’ютера

Отже, як ми з’ясували, будь-яка інформація, яка обробляється сучасними комп’ютерами, представлена в двійковому вигляді.

Кожна комірка пам’яті комп’ютера є фізичною системою, що складається з деякого числа однорідних елементів, які можуть перебувати у двох станах, один з яких відповідає нулю, інший - одиниці.

Кожен такий елемент називається розрядом і використовується для запису одного із розрядів двійкового числа. Комірку із розрядами можна представити так:

Таблиця "Комірка, що складається з k-розрядів"

k-1-й розряд

k-2-й розряд

k-3-й розряд

...

2-й розряд

1-й розряд

0-й розряд

Для подання чисел в пам’яті комп’ютера використовуються два формати: формат з фіксованою крапкою (цілі числа) і формат з плаваючою крапкою (цілі і дробові числа).

Термін «плаваюча крапка» вказує на те, що немає постійної кількості цифр до або після десяткової крапки числа. Іншими словами, сама десяткова крапка може «плавати».

Сформулюємо кілька тез, що визначають особливості зберігання чисел в пам’яті комп’ютера.

  • Для комп’ютерного подання цілих чисел використовують різні способи, які відрізняються кількістю розрядів і наявністю чи відсутністю знакового розряду - розряду для зберігання знаку числа.

  • Беззнакове подання можна використовувати лише для додатних цілих чисел, від’ємні числа представляються лише в знаковому вигляді.

  • При беззнаковому поданні усі розряди комірки пам’яті відводяться під саме число. При поданні зі знаком, найстарший (лівий) розряд відводиться під знак числа, усі інші розряди - під саме число.

  • Якщо число додатне, то в знаковий розряд записується 0, якщо число від’ємне, то в знаковий розряд записується 1.

  • Двійкові розряди в комірці пам’яті нумеруються від 0 до k-1 справа наліво. Старший, k-1-й розряд (який низивається знаковим) у поданні будь-якого додатного числа дорівнює 0, у поданні від’ємного числа - дорівнює 1.

Цілі числа без знаку

Щоб отримати в комп’ютерному поданні беззнакове число в k-розрядній комірці пам’яті, необхідно перетворити це число в двійкову систему числення і доповнити результат зліва незначущими нулями до k розрядів.

Зрозуміло, що числа, які зберігаються в пам’яті комп’ютера, не можуь бути як завгодно великими. Вони мають деякі граничні значення, так як кількість розрядів, що відведені для зберігання числа, обмежена, і точність обчислень також є обмеженою.

В загальному випадку, якщо в системі числення з основою q для запису цілого числа використовується k розрядів, максимально допустиме число X обчислюється за формулою:

Xмаксимальне = qk-1

Максимальне число складається із усіх одиниць і визначається розрядністю (кількістю бітів) k.

Таблиця "Максимальні цілі числа для беззнакового подання при різній кількості розрядів"
Кількість розрядів, k Максимальне число Xмаксимальне = 2k-1

8

255 (28-1)

16

65535 (216-1)

32

4294967295 (232-1)

64

18446744073709551615 (264-1)

Мінімальне значення для беззнакових цілих чисел завжди рівне 0 (усі розряди нульові).

Наприклад, необхідно отримати двійкове подання цілого беззнакового додатного числа 4010 у 1-байтовій комірці пам’яті. Спочатку перетворимо число 4010 у двійкове:

4010 = 1010002

В 8-розрядну комірку пам’яті двійкове подання числа 4010 запишеться так (доповнимо отримане двійкове число зліва незначущими нулями, щоб кількіть розрядів стала 8):

0010 1000

Якщо використовувати для зберігання числа 16-розрядну комірку пам’яті (2-байтову), то двійковий запис числа 4010 буде наступним:

0000 0000 0010 1000

У таблиці нижче наведені деякі восьмирозрядні числа в десятковому, шістнадцятковому і двійковому поданнях.

Таблиця "Десяткове, шістнадцяткове і двійкове подання деяких чисел, які записані у 8-розрядній комірці пам’яті"

X10

0

1

...

127

128

...

255

X16

00

01

...

7F

80

...

FF

X2

0000 0000

0000 0001

...

0111 1111

1000 0000

...

1111 1111

Максимальне беззнакове додатне ціле число, яке можна зберегти у 8-розрядній комірці пам’яті, - 25510. А що відбудеться, якщо в комірці даної розрядності потрібно зберегти число 25610 або більше?

Перетворимо число 25610 в двійкову систему числення:

1 0000 00002

У даному випадку, число 25610 не поміщається в даній кількості розрядів, необхідний ще один розряд, якого не має у 8-розрядній комірці пам’яті. Це називається переповненням.

Переповнення пов’язане з обмеженою кількістю розрядів комірки пам’яті для зберігання числа, і не пов’язане із системою числення.

Відкинувши додатковий розряд (1), в 8-розрядній комірці буде збережений 0 замість 25610. Отже:

25510 + 110 = 0

Такий результат дивний, але саме так відбувається в реальному комп’ютері. При k розрядах комп’ютерна арифметика використовує ділення на

2k

з остачею. Тобто, для числа 256 і при k = 8 маємо:

256 % 28 = 256 % 256 = 0
Символ % в даному випадку позначає оператор ділення з остачею.

Разом з тим, аналогічний результат можна отримати, коли від 0 віднімемо 110. Для цього необхідно «позичити» одиницю із умовно доданого дев’ятого розряду, що міститься за межами 8-розрядної комірки:

1 0000 00002 - 0 0000 00012 = 0 1111 11112

або ж

0 - 110 = 25510
Переповнення

Проблема виходу за відведену розрядну сітку комп’ютера займає важливе місце в реалізації комп’ютерної арифметики.

Ця ситуація, як ми бачимо, не зовсім нормальна і для отримання достовірних результатів її слід уникати. Становище ускладнюється тим, що для процесора описані результати не є чимось «загрозливим», і він «спокійно» продовжує обчислення.

Сам факт переповнення завжди фіксується шляхом установки в одиницю спеціального керуючого розряда (біта), який комп’ютерний застосунок має можливість проаналізувати. Образно кажучи, процесор «помічає» переповнення, але надає програмному забезпеченню право прийняти рішення реагувати на нього або проігнорувати.

В ході роботи з мовами програмування слід враховувати можливість переповнення.

Подивимось на прикладі, як проблема переповнення впливає на достовірність результатів. Наприклад, при зберіганні числа 27010, яке має двійкове значення

1 0000 11102

в 8-розрядній комірці пам’яті, насправді, буде збережено число 1410:

270 % 28 = 270 % 256 = 1410

Якщо збільшувати число далі і пробувати зберігати його в 8-розрядній комірці пам’яті, то можна дійти до якогось максимального значення і знову повернутися до мінімального. Наприклад, якщо взяти число 51210, яке у двійковій системі числення записується

10 0000 00002

у 8-розрядній комірці пам’яті буде збережено число 0, що не є достовірним результатом.

Якщо уважно подивитись на отримані результати, то можна помітити, що при послідовному збільшенні значення числа на одиницю ми доходимо до максимального значенння і повертаємось до мінімального - свого роду, рухаємося циклічно по колу. Така поведінка чисел зображуються, замість традиційного відрізка математичної числової осі, за допомогою кола.

Діапазон цілих беззнакових додатних чисел, які можна зберегти у 8-розрядній комірці пам’яті
Діапазон цілих беззнакових додатних чисел, які можна зберегти у 8-розрядній комірці пам’яті

В k-розрядній цілочисельній комп’ютерній арифметиці

2k = 0

Цілі числа із знаком

Для того, щоб розрізняти додатні і від’ємні числа, у двійковому коді виділяється один біт (розряд) для збергіання знаку числа - знаковий розряд.

Додатні числа

Максимальне додатне ціле число, яке можна записати в знаковому поданні в k розрядах, дорівнює

2k-1-1

Це майже у два рази менше максимального числа в беззнаковому поданні в тих же k розрядах.

Перевіримо це на такому прикладі. Для зберігання цілих чисел в комп’ютері використовується 16-розрядна комірка (два байти). Визначимо, який діапазон чисел можна зберегти в такій комірці, якщо зберігати необхідно лише додатні цілі числа (беззнаковий варіант).

Отже, всього в k = 16-розрядній комірці може зберігатися

216 = 65536

різних значень. Тому, діапазон значень буде наступним:

від 0 до 65535 (від 0 до 2k-1)

Для зберігання і додатних, і від’ємних чисел зі знаком (знаковий варіант) в 16-розрядній комірці буде такий діапазон значень:

від -32768 до 32767 (від -2k-1 до 2k-1-1)

Розглянемо число 4510 = 1011012 у восьмирозрядному поданні:

0010 11012

Це ж число в шістнадцятирозрядному поданні буде записано так:

0000 0000 0010 11012

В обох випадках, як для 1-байтової, так і 2-байтової комірок пам’яті, неважливо, знакове чи беззнакове подання числа при цьому використовується.

А для числа 24510 = 111101012 подання в одному байті (8 розрядів) із знаком є неможливим, оскільки максимально допустиме число в восьмирозрядному поданні дорівнює 127, а в беззнаковому восьмирозрядному поданні число 24510 має вигляд:

1111 01012
Очевидно, що в комірках одного і того ж розміру можна подати більший діапазон цілих додатних чисел в безнаковому вигляді, ніж чисел зі знаком. Тому, якщо відомо наперед, що деяка числова величина завжди є додатною, то вигідніше розглядати її як беззнакову.

При знаковому поданні цілих чисел з’являється таке поняття як прямий код.

Форма подання числа, при якій старший розряд комірки пам’яті відводиться під знак, усі інші k-1 розрядів - під цифри числа, називається прямим кодом.

Наприклад, прямі коди для двійкових чисел

110012
-110012

для 8-розрядної комірки будуть відповідно такими

0001 10012
1001 10012
Додатні цілі числа подаються в комп’ютері за допомогою прямого коду.

Від’ємні числа

Прямий код від’ємного цілого числа відрізняється від прямого коду відповідного додатного цілого числа значенням знакового розряду.

Але замість прямого коду, для подання від’ємних цілих чисел в комп’ютері, використовується додатковий код.

Алгоритм використання додаткового коду для зберігання цілого від’ємного числа:

  1. Перетворити модуль числа у прямий код в k двійкових розрядах.

  2. Отримати зворотний код вхідного числа заміною 0 на 1 і 1 на 0 (інвертувати значення усіх розрядів).

  3. До отриманого зворотного коду, який трактується як k-розрядне додатне двійкове число, додати 1.

Розглянемо наступний приклад. Отримаємо подання цілого від’ємного числа -202010 для зберігання у 16-розрядній комірці пам’яті. Перетворимо число -202010 у двійкову форму:

111111001002

і запишемо прямий код для модуля вхідного числа:

0000 0111 1110 01002

Далі утворимо зворотний код числа -202010

1111 1000 0001 10112

і додамо одиницю для утворення додаткового коду

1111 1000 0001 11002
У підручнику не розглядаються правила виконання математичних операцій з двійковими числами. Тому, для виконання таких дій, використовуйте двійковий калькулятор .

Додатковий код доповнює вхідне число -202010 до

2k

Якщо додати додатковий код

11111000000111002 = 6351610

до вхідного числа -202010, то сума буде дорівнювати значенню 100000000000000002 = 6553610, що свідчить про переповнення (вихід за межі 16-розрядної сітки). Зважаючи на те, що перенесення із старшого розряду не враховується, сума дорівнює нулю.

Додатковий код від’ємного цілого числа - це доповнення модуля цього числа до 2 в степені k (або до нуля в k-розрядній арифметиці).

Побудуємо додатковий восьмирозрядний код для чисел -12810, -12710, -0 і представимо результати у таблиці.

Таблиця "Побудова для цілих від’ємних чисел -12810, -12710 і -0 восьмирозрядного коду"

Число

-128

-127

-0

Прямий код модуля числа

1000 0000

0111 1111

0000 0000

Зворотний код

0111 1111

1000 0000

1111 1111

Додатковий код

1000 0000

1000 0001

0000 0000

Для числа -12810 прямий код співпадає з додатковим, а додатковий код числа -0 співпадає зі звичайним нулем. При перетворенні зворотного коду для числа -0 в його додатковий код, правила звичайної двійкової арифметики порушуються, а саме:

1111 11112 + 1 = 1 0000 00002 = 2k = 0

Використаємо ще один алгоритм отримання додаткового коду від’ємного цілого числа, але який є простішим для проведення обчислень «вручну».

Виконати інверсію усіх старших бітів (розрядів) числа, окрім останньої (молодшої) одиниці і тих нулів, які йдуть за нею.

Застосуємо цей алгоритм для нашого прикладу - змінивши прямий код 0000 0111 1110 01002 цілого від’ємного числа -202010 за поданим алгоритмом, отримаємо той самий додатковий код, що і у попередньому випадку

1111 1000 0001 11002

Проведемо зворотні дії. Отримаємо десяткове значення числа по його додатковому коду 100101112, виконавши такий алгоритм:

  1. Виконати інверсію додаткового коду

100101112 = 011010002
  1. Додати до результату 1:

011010002 + 12 = 011010012
  1. Перетворити отримане двійкове значення в десяткову систему числення:

011010012 = 0 · 27 + 1 · 26 + 1 · 25 + 1 · 24 + 1 · 23 + 1 · 22 + 1 · 21 + 1 · 20 = 0 + 64 + 32 + 0 + 8 + 0 + 0 + 1 = 10510

Результатом обчислень і перетворень буде число

-10510

Розглянемо таблицю двійкових і шістнадцяткових кодів деяких цілих восьмирозрядних додатних і від’ємних чисел.

Таблиця "Двійкове і шістнадцяткове подання деяких чисел, які записані у 8-розрядній комірці пам’яті"

X10

-128

-127

...

-1

0

1

...

127

X16

80

81

...

FF

00

01

...

7F

X2

1000 0000

1000 0001

...

1111 1111

0000 0000

0000 0001

...

0111 1111

Аналізуючи таблицю, слід звернути увагу на стрибок при переході від -1 до 0 і граничні значення 12710 і -12810. За даними таблиці побудуємо коло для чисел зі знаком.

Діапазон цілих чисел зі знаком (додатних і від’ємних), які можна зберегти у 8-розрядній комірці пам’яті
Діапазон цілих чисел зі знаком (додатних і від’ємних), які можна зберегти у 8-розрядній комірці пам’яті

Варто звернути увагу, що порівняння кодів більших 7F16 для чисел з урахуванням і без урахування знака дає різні результати. Наприклад, для беззнакових чисел значення 8116 (12910) точно більше за 7F16 (12710). Для чисел із знаком, навпаки, від’ємне значення 8116 (-12710) буде, безперечно, менше, ніж 7F16 (12710). Порівняння кодів цілих чисел без знаку і зі знаком наведені в таблиці нижче.

Таблиця "Порівнння шістнадцяткових кодів цілих чисел без знаку і зі знаком для 8-розрядних чисел"

Код

0

1

2

...

7F

80

81

...

FE

FF

Без знаку

0

1

2

...

127

128

129

...

254

255

Зі знаком

0

1

2

...

127

-128

-127

...

-2

-1

Ще одним результатом порівняння чисел із знаком і без нього є те, що загальне число їх значень однакове, а їхні діапазони зсунуті на числовій осі.

Порівняння діапазонів цілих чисел зі знаком і без нього, які можна зберегти у 8-розрядній комірці пам’яті
Порівняння діапазонів цілих чисел зі знаком і без нього, які можна зберегти у 8-розрядній комірці пам’яті

Цілі числа зі знаком, що подаються в k-розрядах, належать діапазону

[-2k-1, 2k-1-1]

який не є симетричним відносно нуля. Це варто враховувати при програмуванні. Якщо, наприклад, змінити знак у найбільшого по модулю від’ємного числа, то виявиться, що отриманий результат не можна подати за допомогою тієї ж кількості розрядів.

Майже усі наші міркування були побудовані на базі 8-розрядних чисел. Але вони застосовні для чисел будь-якої розрядності. Від кількості розрядів k залежать лише граничні значення чисел, значення яких наведені в таблиці нижче.

Таблиця "Значення меж діапазонів для знакових подань в комірках з різною розрядністю"
Розрядність Мінімальне число Максимальне число

8

-128

127

16

-32768

32767

32

-2147483648

2147483647

64

-9223372036854775808

9223372036854775807

Дробові числа

Дробові числа в комп’ютері зберігаються у форматі з плаваючою крапкою. Для назви розділення цілої і дробової частини числа використовують також термін «кома«, який і будемо використовувати далі у нашому записі чисел, пам’ятаючи, що в комп’ютері таким розділювачем використовується «крапка«.

Наприклад, дробові числа -459,2 і 0,0000004592 у форматі з плаваючою крапкою записуються так

-4,592E+02
4,592E-07

де символ E читається як помножити на десять у степені (такий запис відображає експоненціальну форму запису числа).

Будь-яке дробове число r в експоненційальній формі записується у вигляді

r = ± m · np

де m - мантиса числа, яка зберігає цифри числа, n - основа системи числення, p - порядок числа (ціле додатне або від’ємне число, яке вказує місце крапки в записі).

У десятковій системі такий запис використовують для позначення, наприклад, фізичних величин: швидкості світла у вакуумі

3 · 108 м/с

сталої Больцмана

1,380649 · 10-23 Дж·К-1

тощо.

Числа з плаваючою крапкою можна подати різними способами, наприклад, для числа 34,5 будуть справедливі такі експоненціальні форми:

3450,0 · 10-2
345,0 · 10-1
34,5 · 100
3,45 · 101
0,345 · 102
0,0345 · 103

Проте, запис чисел, в яких мантиса містить нулі перед десятковою крапкою (3450,0) чи після неї (0,0345) є не дуже хорошим варіантом, оскільки, зберігаючи ці нулі, збільшується розрядність чисел.

З практичної точки зору, більш зручно подавати число в експоненціальній формі, де ціла частина мантиси складається із єдиної ненульової цифри:

3,45 · 101

В цьому випадку, мантиса повинна задовільняти умову:

1 ≤ m < n

де n - основа системи числення. Таке подання дробових чисел в комп’ютері називають нормалізованим.

Для нормалізованого запису числа нуль є своє правило: якщо і мантиса, і порядок рівні нулю, запис нуля є нормалізованим.

Наведемо приклади нормалізації деяких дробових чисел:

31,41592610 = 3,141592610 · 101
0,0004510 = 4,510 · 10-4
В комп’ютерному поданні дробових чисел кількість цифр (розрядів) в мантисі визначає точність обчислень, з якою можна подати число, а кількість цифр (розрядів) для запису порядку - діапазон чисел.

В різних типах комп’ютерів застосовуються різні варіанти подання дробових чисел у формі з плаваючою крапкою. Для прикладу, розглянемо подання дробового числа в 4-байтовій комірці пам’яті.

Подання дробового числа у 4-байтовій комірці пам’яті
Подання дробового числа у 4-байтовій комірці пам’яті

Отже, в комірці повинна зберігатися наступна інформація про число:

  • знак числа (зберігається в старшому біті і може мати значення: 0 - позначає плюс, 1 - мінус);

  • машинний порядок (машинний порядок зміщений відносно математичного порядку на певну величину і має лише додатні значення);

  • цифри мантиси.

IEEE 754 - стандарт формату представлення чисел з плаваючою крапкою

Комп’ютери, що серійно випускалися різними фірмами, використовували різні формати представлення чисел. В першу чергу, це стосувалося чисел із плаваючою крапкою.

Щоб спростити використання програм, розроблених для різних платформ, було запропоновано стандарт IEEE 754 , який регламентує формат запису чисел із плаваючою крапкою.

IEEE 754 - це технічний стандарт для обчислень з плаваючою крапкою, встановлений в 1985 році Інститутом інженерів електротехніки та електроніки (IEEE ). Удосконалена версія стандарту зв’явилася у 2008 році і позиціонується як новий стандарт IEEE Std 754-2008.

Версія 754 стала дуже популярною і є найбільш широко використовуваним форматом для обчислення з плаваючою крапкою бібліотеками програмного забезпечення і апаратними компонентами (процесорами). Цей стандарт дозволяє зберігати числа з плаваючою крапкою в певних межах числового простору, в якому обчислення виконуються порівняно швидко.

Багато компіляторів мов програмування використовують цей стандарт для зберігання чисел та виконання математичних операцій.

Нині цей стандарт широко використовується, і практично всі розробники комп’ютерів дотримуються його вимог. Цей стандарт визначає два базових формати (32- та 64-бітний), з 8- та 11-розрядними машинними порядками відповідно.

Для формату одинарної точності binary32 (двійковий формат з кодами довжиною 32 біти) величина зсуву порядку

27-1 = 12710

а для формату подвійної точності binary64 (двійковий формат з кодами довжиною 64 біти) величина зсуву порядку

210-1 = 102310
32-бітний і 64-бітний формати чисел з плаваючою крапкою в стандарті IEEE 754
32-бітний і 64-бітний формати чисел з плаваючою крапкою в стандарті IEEE 754

Значення числа A з одинарною точністю обчислюється за формулою:

A = (-1)S · 2E-127 · (1,M)

Або у випадку подвійної точності формула матиме вигляд:

A = (-1)S · 2E-1023 · (1,M)

Стандарт IEEE 754 також визначає розширені формати точності, які рекомендовані для забезпечення більшої точності, ніж базові формати, і передбачає використання певної кількості значень мантиси та порядку для представлення нескінчених, невизначених та малих значень.

Наприклад, для представлення невизначеного значення використовується максимальне значення порядку та ненульова мантиса.

Невизначене значення називають не числом - NotaNu­mber (NaN). NaN використовується, щоб представити значення, яке не є числом і часто застосовується як індикатор помилки в обчисленнях.

Для нашого випадку, зв’язок між машинним порядком Mp і математичним p буде описуватися формулою:

Mp10 = p10 + 12710

Ця формула записана в десятковій системі числення. У двійковій системі вона має такий вигляд:

Mp2 = p2 + 11111112

Отже, у нашій ситуації для зберігання дробового числа необхідно виконати наступний алгоритм.

  1. Перетворити модуль даного дробового числа у двійкову систему числення.

  2. Нормалізувати двійкове число.

  3. Знайти машинний порядок в двійковій системі числення.

  4. Враховуючи знак числа, записати його подання в 4-байтовому машинному слові.

Запишемо подання в пам’яті дробового від’ємного числа -13,37510 у формі з плаваючою крапкою, використовуючи даний алгоритм.

  1. Перетворити модуль дробового числа -13,37510 у двійкову систему числення:

13,37510 = 1101,0112
  1. Записати експоненціальний запис двійкового числа у нормалізованій формі:

1101,0112 = 1,1010112 · 10211

В цьому записі мантиса 1,101011, основа системи числення (210 = 102) і порядок (310 = 112) записані у двійковій системі.

Ціла частина мантиси в нормалізованому вигляді дорівнює 1 і не входить до коду числа. Це, так звана, прихована одиниця, яка не зберігається в пам’яті, як наслідок, це економія одного розряду. На місце мантиси записується хвіст мантиси - всі дробові цифри мантиси (крім першої одиниці, яка є цілою частиною).
  1. Обчислити машинний порядок у десятковій формі:

Mp10 = 310 + 12710 = 13010

У двійковій формі машинний порядок матиме вигляд:

13010 = 100000102
На відміну від цілих чисел, мантиса дробових чисел зберігається в прямому коді. Таким чином, мантиси додатного і, рівного за модулем, від’ємного числа однакові, а відрізняються вони лише старшим (знаковим) бітом.
  1. Записати двійкове подання числа в 4-байтовій комірці пам’яті з урахуванням знаку числа:

1 10000010 101011000000000000000002

Прогалини у двійковому коді поставлені тільки для зручності читання і відокремлюють знаковий біт від машинного порядку, а машинний порядок - від мантиси.

Отримаємо більш компактний запис в шістнадцятковій системі:

C156000016

Розв’яжемо обернену задачу. Визначимо десяткове представлення дробового числа за шістнадцятковим поданням 41C4000016.

Перетворимо шістнадцяткове число 41C4000016 у двійкову систему і розділимо пропуски по чотири розряди для кращого читання:

41C4000016 = 0100 0001 1100 0100 0000 0000 0000 00002

А тепер розтавимо пропуски так, щоб відділити знаковий біт від машинного порядку, а машинний порядок - від мантиси:

0 10000011 100010000000000000000002

Число додатне, так як в знаковому розряді присутній нуль.

Машинний порядок числа має значення 100000112. Перетворимо це двійкове число в десяткову cистему числення

100000112 = 13110

і визначимо математичний порядок числа

13110 - 12710 = 410

Мантиса числа 100010000000000000000002, отже, нормалізована мантиса

1,100010000000000000000002

Шукане число в нормалізованій формі

1,10001 · 24

або ж, якщо використовувати повністю двійковий запис для основи системи числення (210 = 102) і порядку (410 = 1002)

1,10001 · 10100

Записавши без мантиси і перенісши крапку на чотири розряди вправо, отримаємо двійкове значення, після перетворення якого в десяткову систему числення, матимемо значення дробового числа

11000,12 = 24,510

Додаток B: Числа в Python

Цілі числа

Python підтримує десяткові, двійкові, вісімкові та шістнадцяткові цілі числа, причому не накладається ніяких обмежень на величину (довжину) числа, головне, щоб вистачало пам’яті для зберігання таких чисел.

Десяткові цілі числа створюються за допомогою десяткових цифр:

0
7
168
44601490397061246283071436545296723011960832

Двійкові числа складаються з префікса 0b (або 0B) і двійкових цифр 0 і 1:

>>> 0b0
0
>>> 0b1
1
>>> 0b10
2
>>> 0b100
4
>>> 0b111
7
>>> 0b10011001
153
>>> 0B100001
33

Вісімкові числа починаються з префікса 0o (0O) і можуть містити тільки цифри 0, 1, 2, 3, 4, 5, 6, 7:

>>> 0o0
0
>>> 0o1
1
>>> 0o12
10
>>> 0o45
37
>>> 0o2021
1041

Шістнадцяткові числа починаються з префікса 0x (0X) і можуть містити як всі десяткові цифри, так і символи латинського алфавіту: a, b, c, d, e, f (або A, B, C, D, E, F), які в даному випадку виступають в ролі чисел:

>>> 0x0
0
>>> 0x15
21
>>> 0xD4
212
>>> 0xab4
2740
>>> 0xC1
193
У мовах програмування із суворою типізацією необхідно вказувати як тип числа, так і те, що створюваний об’єкт сам є числом. Але в Python такої необхідності немає, інтерпретатор Python сам, на основі аналізу літералів чисел, здатний зрозуміти, що перед ним: число або ні, ціле або з плаваючою крапкою, двійкове або шістнадцяткове тощо.
Функція int() у Python і системи числення

У мові Python присутня функція int(), який повертає цілий об’єкт з будь-якого числа або рядка. Наприклад:

>>> int(123)
123
>>> int(123.456)
123
>>> int('123')
123

У разі, коли вказується другий аргумент для функції int(), перший аргумент завжди повинен бути рядком.

За допомогою другого аргументу функції int() повідомляється, в якій системі числення знаходиться число, вказане в рядку першого аргумента. Функція int() повертає значення цього числа у десятковій системі числення. Наприклад:

>>> int('120', 8)
80
>>> int('120', 6)
48
>>> int('13K', 21)
524
>>> int('110011', 2)
51
>>> int('4D', 16)
77

Зокрема, для двійкової, вісімкової та шістнадцяткової систем числення у функції int() можна використовувати префікси.

Якщо представлення числа використовує префікси і число помістили у лапки, то другий аргумент у методі int() є обов’язковим.

Для бінарних чисел (0b or 0B):

>>> int(0b111)
7
>>> int('0b111', 2)
7
>>> int('0B111', 2)
7

Для вісімкових чисел (0o or 0O):

>>> int(0o15)
13
>>> int('0o15', 8)
13
>>> int('0O15', 8)
13

Для шістнадцяткових чисел (0x):

>>> int(0x2D5)
725
>>> int('0x2D5', 16)
725
Функція int() завжди повертає десяткове ціле число. Якщо перетворити перший аргумент в десяткове число не вдається, то генерується помилка.

Розглянемо підтримку цілих чисел у Python і на практиці подивимось, як створюються цілі числа.

В інтерактивному інтерпретаторі Python запишемо інструкцію:

>>> a = 39

У загальному випадку, в мові програмування, даний запис можна прочитати так: змінній a присвоїти цілочисельне значення 39 . Символом = тут позначається оператор присвоєння.

Змінні в Python - імена-посилання на об’єкти.

Тобто, у записі a = 39, a - посилання на об’єкт (екземпляр класу int) - ціле число 39.

Виконаємо ще одне «присвоєння»:

>>> b = a

Запис b = a змушує ім’я b посилатися на той самий об’єкт, що і ім’я a. Перевіримо це твердження:

>>> a is b
True
Операція a is b перевіряє, чи вказують обидва імені на один і той же об’єкт.

Оператор is перевіряє об’єкти на ідентичність:

  • x is y буде істиною, якщо x і y є одним і тим же об’єктом;

  • також можна використовувати конструкцію is not, наприклад, x is not y буде істиною, якщо x і y є різними об’єктами.

PEP8 рекомендує використовувати оператор is для порівняння з об’єктами, що існують в єдиному екземплярі, наприклад, для None.
if foo is not None:
    pass

Перевірку на ідентичність можна виконати також за допомогою функції id():

>>> id(a) == id(b)
True
>>> id(a)
140713044069216
>>> id(b)
140713044069216
Функція id() повертає унікальний ідентифікатор для зазначеного об’єкта. Ідентифікатор - це ціле число, яке гарантовано є унікальним та постійним для цього об’єкта протягом його життя (від моменту створення і до моменту знищення об’єкта). Для порівняння ідентифікаторів об’єктів ми використали оператор порівняння ==.

Проілюструємо вищенаведені відомості ще на одному прикладі.

>>> a = 3
>>> b = 3
>>> id(3) == id(a) == id(b)
True
>>> id(3)
140713044068064
>>> id(a)
140713044068064
>>> id(b)
140713044068064
>>> c = 257
>>> d = 257
>>> id(257) == id(c) == id(d)
False
>>> id(257)
1980287707152
>>> id(c)
1980287707408
>>> id(d)
1980287707120
>>>

Ідентичність об’єкта асоціюється з адресою об’єкта в пам’яті (для реалізації CPython - найбільш поширена, еталонна реалізація інтерпретатора мови програмування Python, яку ми, власне, і завантажуємо із офіційного сайта) і буде різною для кожного запуску, окрім деяких об’єктів, які мають постійний унікальний ідентифікатор, таких, як цілі числа від -5 до 256 включно.

Коли ви створюєте об’єкт типу int у цьому діапазоні, ви, фактично, просто отримуєте посилання на вже існуючий об’єкт, а не на новий об’єкт. А от, наприклад, для числа 257 буде створений новий об’єкт.

Усі цілі числа у Python реалізуються як довгі цілі об’єкти довільної величини .

Інтерпретатор Python оптимізований так, що невеликі цілі числа представлені одним об’єктом - це зроблено з метою поліпшення продуктивності. Для великих чисел це вже не виконується.

Інші реалізації Python, такі як Jython або IronPython, можуть мати іншу реалізацію функції id(). Тому, наведені вище приклади є особливостями реалізації інтерпретатора, а не мовною особливістю Python.

У стандартній реалізації CPython (написаний на мові C ) є багато заздалегідь визначених об’єктів, включаючи кілька малих цілих чисел та кілька одиничних символів ASCII .

Реальний код повинен бути незалежним від деталей реалізації. Тому, для порівняння чисел, не варто використовувати перевірку на ідентичність (різні об’єкти можуть мати одне значення). Використовуйте a == b, щоб дізнатися чи рівні числа. Наприклад:

>>> x = 39
>>> y = 39
>>> x == y # має бути два різних об'єкти з однаковими значеннями: порівняння
True
>>> x is y # той самий об'єкт: кешування
True
>>>

У цьому прикладі змінні x і y повинні бути рівні (==, одне і те ж значення), але не еквівалентні (is, один і той же об’єкт). Однак, через те, що малі цілі числа і рядки кешуються і використовуються повторно, оператор is повідомляє, що імена-змінні посилаються на один і той же об’єкт.

Отже, коли ви «запитаєте» Python, чи дійсно -5 is -5, це, безумовно, буде True, тому що обидва екземпляри є одним і тим же екземпляром, тоді, як поза діапазоном [-5, 256], CPython може створювати і, ймовірно, створює нові екземпляри цілих чисел.

Проілюструємо наші міркування на прикладі.

>>> a = 257
>>> b = 257
>>> a is b
False
>>> id(a) == id(b)
False
>>> id(a)
1624253033232
>>> id(b)
1624253032464
>>> 257 is 257
<stdin>:1: SyntaxWarning: "is" with a literal. Did you mean "=="?
True
>>> id(257) == id(257)
True
>>>

Чому 257 is 257 дає значення True? Це пов’язано з тим, що Python виконує цю інтерактивну інструкцію як єдиний блок (в реалізації CPython). Під час інтерпретації цього твердження, CPython «побачить», що у вас є два однакові літерали і буде використовувати одне і те ж представлення 257.

Наприкінці, розглянемо ще одну особливість виконання коду в інтерактивному режимі інтерпретатора CPython:

>>> id(333)
2609261210384
>>> id(334)
2609261210384
>>> id(335)
2609261210384
>>> id(333), id(334), id(335)
(2609261210384, 2609261209872, 2609231362288)

Такі результати можна пояснити, звернувшись до документації Python для функції id().

Два об’єкти з періодами життя, що не перекриваються, можуть мати однакове значення id() .

Іншими словами, оскільки ми не зберігаємо жодних посилань на ціле число 333, його об’єкт видаляється з пам’яті після друку в інтерактивному режимі інтерпретатора.

Потім ми створюємо об’єкт 334, і йому видається така сама адреса в пам’яті. Так як немає посилань на ціле число 334, його об’єкт також видаляється з пам’яті. При створенні об’єкта 335 йому знову видається та сама адреса в пам’яті і т.д.

При виконанні інструкцій єдиним блоком, ми спотерігаємо різні значення id для поданих цілих об’єктів.

Числа з плаваючою крапкою

У Python, головною відмінністю дробових чисел від цілих є наявність символу крапки . (не коми, як ми звикли записувати), яка відділяє цілу частину від дробової. Тому запис десяткових дробових чисел у Python буде таким:

3.5
6.0
6.
0.24
.24

Якщо Python бачить, що зліва чи справа від крапки нічого немає, то він розуміє, що або ціла, або дробова частина дорівнює 0.

Такий запис десяткового дробового числа називається класичним або з фіксованою крапкою.

Іншою відмінною рисою, зокрема для запису дуже великих або дуже маленьких за модулем дробових чисел, є використання формату з плаваючою крапкою.

У цьому випадку число представляється у вигляді деякого десяткового дробового числа (мантиса), яке помножене на 10 (основа системи числення) в деякому степені (порядок).

Наприклад, у фізиці, маса електрона (у кг) записується у форматі з плаваючою крапкою так:

9.1 · 10-31

У Python числа з плаваючою крапкою записуюються у вигляді мантиси, потім пишеться буква e (експонента), потім пишеться порядок. Пропуски всередині цього запису не ставляться. Перед самим числом також може стояти знак мінус -. Наприклад, маса електрона (в кг) у Python може бути записана у форматі з плаваючою крапкою так:

9.1e-31
Основні типи представлення чисел з плаваючою крапкою

single precision - представлення числа у вигляді 32-бітного рядка, при цьому перший біт зарезервований для подання знака числа, 23 біта - під мантиссу, а 8 - під експоненту.

double precision - «з подвійною точністю» - числа представляються у вигляді 64 бітів, 1 біт під знак числа, 52 - під мантису, 11 - під експоненту.

Cтандартним типом у мові програмування Python, який використовується для представлення дробових чисел - це float. Якщо на довжину цілих чисел не накладається абсолютно ніяких обмежень по величині, то з дробовими числами це не так.

Щоб дізнатися інформацію про числа типу float для комп’ютера, на якому відкритий інтерактивний режим інтерпретатора Python, можна скористатися такими командами:

>>> import sys
>>> sys.float_info # виведення відформатовано вручну
sys.float_info(max=1.7976931348623157e+308, (1)
               max_exp=1024, (2)
               max_10_exp=308, (3)
               min=2.2250738585072014e-308, (4)
               min_exp=-1021, (5)
               min_10_exp=-307, (6)
               dig=15, (7)
               mant_dig=53, (8)
               epsilon=2.220446049250313e-16, (9)
               radix=2, (10)
               rounds=1) (11)
  1. max - максимальне число для подання.

  2. max_exp - максимальна степінь двійки.

  3. max_10_exp - максимальне число e, таке, що 10 у степені e знаходиться в діапазоні [min, max].

  4. min - мінімальне число для подання.

  5. min_exp - мінімальна степінь двійки.

  6. min_10_exp - мінімальне число e, таке, що 10 у степені e знаходиться в діапазоні [min, max].

  7. dig - максимальне число цифр, якими можна точно відобразити число.

  8. mant_dig - максимальне число цифр в radix-системі числення, якими можна точно відобразити число.

  9. epsilon - різниця між 1 і найменшим числом (більшим за 1), яку можна подати як число з плаваючою крапкою.

  10. radix - основа системи числення, що використовується.

  11. rounds - цілочисельна константа, яка визначає режим округлення.

У наступному прикладі показано допустиме подання числа і вихід за межі типу float у Python:

>>> 10.0**308
1e+308
>>> 10.0**309
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: (34, 'Result too large')

Як бачимо, Python генерує виняток OverflowError. Цей виняток виникає, коли результат арифметичної операції занадто великий для його подання. Він не з’являється при звичайній роботі з цілими числами, так як Python підтримує «довгі числа».

Проте, замість помилок OverflowError, коли число виходить за вказані межі, іноді з’являються значення -inf і inf:

>>> 1.7e+308 * 1.7e+308
inf
>>> -1.7e+308 * 1.7e+308
-inf

Значення -inf і inf - це не що інше, як числа, що позначають -/+ нескінченність. Це також числа з плаваючою крапкою, які можуть брати участь в обчисленнях:

>>> a = 10e555
>>> a
inf
>>> a * 100
inf
>>> a - 100
inf

Однак, що б ви не робили з нескінченністю, вона так і залишиться нескінченністю. Єдине, що можна спробувати, так це відняти від однієї нескінченності іншу нескінченність:

>>> a = 10e555
>>> b = 10e554
>>> a
inf
>>> b
inf
>>> c = a - b
>>> c
nan
nan - значення, яке означає не число (Not-a-Number) - одне з особливих значень числа з плаваючою комою. Проте, значення nan поводиться як число, і, якщо воно з’явиться у деякому виразі, результат завжди буде nan (окрім операції nan/0, яка генерує помилку ділення на нуль).
>>> c + 50
nan
>>> c * a * b
nan
>>> c / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

Окрім обмеженого діапазану значень, у чисел з плаваючою крапкою є ще одна проблема, яка пов’язана з їх поданням в пам’яті комп’ютера.

Числа з плаваючою крапкою представлені в комп’ютерних апаратних системах як дроби з основою 2 (двійкова система числення). Наприклад, якщо десятковий дріб 0.125 має значення

1/10 + 2/100 + 5/1000

то, таким же чином, двійковий дріб 0.001 має значення

0/2 + 0/4 + 1/8

Ці два дроби мають однакові значення і відрізняються лише тим, що перший записаний в дробовому вигляді за основою 10, а другий - за основою 2.

Більшість десяткових дробів не можуть бути точно представлені в двійковому записі. Наслідком цього є те, що, в основному, десяткові дробові числа є тільки наближеними до двійкових, які і зберігаються в пам’яті комп’ютера.

Проблему легше зрозуміти на прикладі десяткової системи числення.

Розглянемо дріб 1/3. Його можна записати десятковим дробом

0.3

або

0.33

або

0.333

і т. д. Незалежно від того, як багато цифр ви запишете, результат ніколи не буде точно дорівнювати 1/3, але буде все більш кращим наближенням до 1/3.

Аналогічно, у двійковій системі числення, не має значення, як багато цифр з основою 2 ви будете використовувати, десяткове значення 0.1 не може бути представлено точно в двійковому записі дробу. За основою 2 десятковий дріб 1/10 - це нескінченно повторюваний дріб.

0.0001100110011001100110011001100110011001100110011(0011)

Якщо зупинитись на будь-якій кінцевій кількості біт, це приведе до отримання наближення.

У мові Python стандартний тип float має подвійну точність, тобто зберігається у вигляді 64-бітного рядка.

Python виводить тільки десяткове наближення справжнього десяткового значення від двійкового наближення, що зберігається в пам’яті комп’ютера. На більшості комп’ютерів, якби Python виводив десяткове значення двійкового наближення числа 0.1, то результат міг би бути, наприклад, таким (використано рядкове форматування):

>>> f'{0.1:.55f}'
'0.1000000000000000055511151231257827021181583404541015625'

Але Python дозволяє керувати кількістю цифр, відображаючи округлене значення:

>>> 1/10
0.1
Якщо, навіть, результат виглядає як точне значення 1/10, то, насправді, збережене значення - це найближче представлення двійкового дробу.

Такі наближення можуть породжувати цікаві ситуації при обчисленнях в Python. Наприклад, оскільки 0.1 не є точним значенням 1/10, сума трьох значень 0.1 не дорівнює точно 0.3:

>>> 0.1 + 0.1 + 0.1 == 0.3
False

Також, оскільки 0.1 не може наблизитися до точного значення 1/10 і 0.3 не може наблизитися до точної величини 3/10, то попереднє округлення за допомогою функції round(), вбудованої в Python, не допомагає:

>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1)
False
Округлення в Python здійснюється вбудованою функцією round(number, digits), де number - число, яке округлюється, а digits - кількість знаків після крапки.

Хоча числа не можуть бути наближені до їх точних значень, функція round() може бути корисною для округлення результату обчислень:

>>> round(.1 + .1 + .1, 10) == round(.3, 10)
True

Розглянемо ще кілька прикладів подання чисел з плаваючою крапкою в Python, використовуючи рядкове форматування:

>>> f'{2.55:.30f}'
'2.549999999999999822364316059975'
>>> f'{2.65:.30f}'
'2.649999999999999911182158029987'
>>> f'{2.75:.30f}'
'2.750000000000000000000000000000'
>>> f'{2.85:.30f}'
'2.850000000000000088817841970013'
>>> f'{2.5:.30f}'
'2.500000000000000000000000000000'
>>> f'{1.5:.30f}'
'1.500000000000000000000000000000'
>>> f'{8.45:.30f}'
'8.449999999999999289457264239900'

Застосуємо до чисел, поданих вище, округлення за допомогою функції round():

>>> round(2.55, 1)
2.5
>>> round(2.65, 1)
2.6
>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9
>>> round(2.5)
2
>>> round(1.5)
2
>>> round(8.45, 1)
8.4

Такі результати округлення можуть говорити про те, що Python (версій 3.x.x) використовує різні правила для округлення.

Щоб з’ясувати, яке округлення використовується, потрібно поглянути на запис числа з великою кількістю знаків після крапки:

  • якщо число в машинному поданні не точно представляється, то округлення відбувається до найближчого числа;

  • якщо число в машинному поданні точно представляється, то використовується банківське округлення - округлення до найближчого парного.

Для боротьби з несподіваними результатами арифметичних обчислень, коли вимагається точність обчислень, рекомендується використовувати бібліотеку decimal.

Для випадків, які вимагають точного десяткового подання, спробуйте використовувати модуль decimal , який реалізує десяткову арифметику і підходить для бухгалтерських і високоточних обчислень.

Інша форма точної арифметики підтримується модулем fractions , який реалізує арифметику, засновану на раціональних числах (тобто, числа подібні 1/3 можуть бути представлені точно).

Якщо ви часто використовуєте операції з плаваючою крапкою, вам слід поглянути на пакунки для математичних і статистичних операцій, що надаються проектом scipy.org .

Приклад використання модуля decimal

n = int(input()) # кількість знаків після крапки
from decimal import Decimal, ROUND_HALF_UP
e = Decimal('2.7182818284590452353602875')
print(e.quantize(Decimal('1.'+n*'0'), ROUND_HALF_UP))

коли необхідно виконати математичне округлення до вказаної кількості знаків після крапки:

19
2.7182818284590452354
Стандартно, максимальне число цифр після крапки, якими можна точно відобразити дробове число у Python - 15. Модуль decimal допоміг математично правильно округлити число 2.7182818284590452353602875 до 19 знаків після крапки.

Python надає інструменти (методи), які можуть допомогти в тих рідкісних випадках, коли ви справді хочете дізнатися точне значення дробового числа.

Наприклад, метод as_integer_ratio() подає значення дробового числа як дріб (повертає пару цілих чисел (кортеж), перше з яких дорівнює чисельнику, а друге - завжди додатному знаменнику звичайного дробу, значення якого точно співпадає з вхідним числом типу float):

>>> x = 0.7
>>> x.as_integer_ratio()
(3152519739159347, 4503599627370496)

Оскільки це співвідношення точне, воно може бути використано, щоб без втрат відтворити початкове значення:

>>> x == 3152519739159347 / 4503599627370496
True

Поява таких великих чисел пов’язане з тим, що числа типу float, насправді, не є десятковими дробами, і зберігаються в пам’яті з невеликою похибкою:

>>> from decimal import *
>>> Decimal(3152519739159347) / Decimal(4503599627370496)
Decimal('0.6999999999999999555910790150')

За допомогою модулів decimal і fractions можна легко керувати точністю подання чисел в Python. В наступному прикладі, метод from_float() будує точне значення числа типу float:

>>> from decimal import *
>>> from fractions import *
>>> x = 1.8
>>> Decimal.from_float(x)
Decimal('1.8000000000000000444089209850062616169452667236328125')
>>> Fraction.from_float(x)
Fraction(8106479329266893, 4503599627370496)
>>> 8106479329266893 / 4503599627370496
1.8
>>> f'{Decimal.from_float(x):.17f}'
'1.80000000000000004'

Python дозволяє перетворювати числа з плаваючою крапкою з десяткової системи числення в шістнадцяткову і навпаки. Для цього використовуються методи hex() і fromhex() відповідно:

>>> float.hex(4.56789)
'0x1.24584f4c6e6dap+2'
>>> float.fromhex('0x1.24584f4c6e6dap+2')
4.56789

Створення чисел з плаваючою крапкою з їх шістнадцяткового подання дозволяє уникнути похибки, яка неминуче виникає при перетворенні десяткових дробових чисел у двійкову систему числення.

Шістнадцяткові числа з плаваючою крапкою в Python задаються рядком виду

[sign] ['0x'] integer ['.' fraction] ['p' exponent]

в якому:

  • sign - необов’язковий знак, який може бути як + або -;

  • integer і fraction - ціла і дробова частини, які повинні обов’язково містити хоча б по одній цифрі;

  • '0x' - префікс, що позначає шістнадцяткові числа;

  • 'p' exponent - експонента у вигляді десяткового цілого числа зі знаком чи без (показник степеня 'p' exponent є степенем двійки).

Наприклад, перетворення числа '0x2.f1ap+3' з шістнадцяткової системи числення в десяткову буде виглядати наступним чином:

>>> (2 + 15./16 + 1./16**2 + 10./16**3)*2**3
23.55078125

Застосування зворотного перетворення дає інший шістнадцятковий рядок, який, однак, представляє те ж саме число:

>>> float.hex(23.55078125)
'0x1.78d0000000000p+4'
>>> (1 + 7./16 + 8./16**2 + 13./16**3)*2**4
23.55078125