Числа з плаваючою комою: подання, переваги/недоліки, арифметика
Розділ: Архітектура компʼютера
📌 Про що ця тема
Тут перевіряють, як комп'ютер зберігає дробові й дуже великі/малі числа у двійковому вигляді. Ключове поняття — число з плаваючою комою (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, тож її не зберігають, економлячи біт.