Числа з плаваючою комою: подання, переваги/недоліки, арифметика

Розділ: Архітектура компʼютера

📌 Про що ця тема

Тут перевіряють, як комп'ютер зберігає дробові й дуже великі/малі числа у двійковому вигляді. Ключове поняття — число з плаваючою комою (floating point): форма запису, де окремо зберігаються мантиса (значущі цифри) і порядок (показник степеня).


📖 Головне

• Число у плаваючій комі має вигляд N = ±M · 2^E, де M — мантиса, E — порядок (степінь двійки). Аналог наукового запису 1,23·10^5 у десятковій системі.

• Нормалізована форма: мантиса записана так, що ціла частина — одна значуща цифра (у двійковій це завжди 1, тому її часто не зберігають — «прихований біт»). Приклад: 0,0101 нормалізують до 1,01·2^−2.

• Число у пам'яті складається з трьох полів: знак (1 біт: 0 — плюс, 1 — мінус), порядок (exponent) і мантиса (fraction).

• Стандарт IEEE 754. Одинарна точність (float) — 32 біти: 1 знак + 8 порядок + 23 мантиса. Подвійна (double) — 64 біти: 1 + 11 + 52.

• Порядок зберігається зі зсувом (bias), щоб кодувати і додатні, і від'ємні степені без окремого знака: для float зсув 127, для double — 1023. Реальний порядок E = (записане значення) − зсув.

• Перевага: величезний діапазон (дуже великі й дуже малі числа) при фіксованій кількості бітів — завдяки «плаваючій» позиції коми.

• Недолік: обмежена точність. Багато десяткових дробів (напр. 0,1) у двійковій системі нескінченні, тому зберігаються наближено → похибки заокруглення.

• Протиставлення: числа з фіксованою комою мають сталу кількість знаків після коми — точніше, але вузький діапазон.

• Чим більше бітів на мантису — тим вища точність; більше бітів на порядок — ширший діапазон.


🔢 Як це працює на прикладі

Подамо число 6,25 у плаваючій комі (float).

1. Переводимо в двійкову: 6 = 110₂, 0,25 = 0,01₂ → 110,01₂.

2. Нормалізуємо: 1,1001 · 2^2. Реальний порядок E = 2.

3. Знак: число додатне → 0.

4. Порядок у пам'яті: 2 + 127 = 129 = 10000001₂.

5. Мантиса: дробова частина після коми 1001, доповнена нулями до 23 бітів (прихована 1 не зберігається).

Результат: 0 | 10000001 | 10010000000000000000000.


Зворотно: щоб отримати значення, рахуємо (−1)^знак · 1,мантиса · 2^(порядок−127).


⚠️ Типові помилки

• Забувають про зсув порядку: пишуть у поле exponent саме E, а не E + 127 (чи 1023).

• Не враховують прихований біт: записують провідну 1 у мантису або, навпаки, забувають її додати при зворотному переведенні.

• Плутають біти float і double (8/23 проти 11/52).

• Вважають, що float зберігає будь-який дріб точно — звідси нерозуміння, чому 0,1 + 0,2 ≠ 0,3.

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


🎯 Що завчити напамʼять

• Формула: N = ±M · 2^E.

• float: 32 біти = 1 + 8 + 23, зсув 127.

• double: 64 біти = 1 + 11 + 52, зсув 1023.

• Прихований біт = 1 (у нормалізованій формі).

• E_реальне = E_записане − зсув.


🧠 Перевір себе

1. Скільки бітів відведено на мантису у форматі double?

2. Чому float ширший за діапазоном, але менш точний, ніж фіксована кома на тій же кількості бітів?

3. Який реальний порядок, якщо в полі exponent формату float записано 130?

4. Що таке прихований біт і чому його не зберігають?


Відповіді: 1 — 52 біти; 2 — бо частина бітів іде на порядок (діапазон), а на значущі цифри (точність) лишається менше; 3 — 130 − 127 = 3; 4 — це провідна 1 нормалізованої мантиси; вона завжди 1, тож її не зберігають, економлячи біт.

Перевірити себе на практиці

Прочитати — половина справи. Далі потрібні завдання цієї ж теми з розбором кожної відповіді: саме на них видно, чи справді тема закрита.