Подання чисел в двійковому коді з плаваючою комою
Часто доводиться обробляти дуже великі числа (наприклад, відстань між зірками) або навпаки дуже маленькі числа (наприклад, розміри атомів або електронів). При таких обчисленнях довелося б використовувати числа з дуже великою розрядністю. У той же час нам не потрібно знати відстань між зірками з точністю до міліметра. Для обчислень з такими величинами числа з фіксованою комою неефективні.
В десяткової арифметики для запису таких чисел використовується алгебраїчна форма. При цьому число записується у вигляді мантиси, помноженої на 10 у степені, що відображає порядок числа, Наприклад:
0,2 × 10 5,
0,16 × 10 -38
Для запису двійкових чисел теж використовується така форма запису. Вона дозволяє працювати з числами з великим діапазоном значень Ця форма запису називається запис числа з плаваючою крапкою. Нагадаємо, що мантиса не може бути більше одиниці і після коми в мантисі НЕ можетзапісиваться нуль.
У програмуванні для запису таких чисел використовуються спеціальні формати змінних. У мові СІ це такі формати як float і double. Вони описуються стандартом IEEE 754. Цих же стандартів дотримується більшість інших мов програмування. При роботі з числами з плаваючою комою в складі мови програмування зазвичай не виникає труднощів. Всі перетворення форматів чисел здійснюються засобами самої мови програмування. Однак при передачі даних або при роботі з мікроконтролерами часто доводиться писати програму на мові програмування асемблер і тоді може знадобитися знання внутрішнього подання цих чисел.
Для запису числа в форматі з плаваючою комою одинарної точності потрібно трідцатідвухбітовое слово. Для запису чисел з подвійною точністю потрібно шестідесятічетирёхбітовое слово. Найчастіше числа зберігаються в кількох сусідніх комірках пам'яті процесора. Формати числа в форматі з плаваючою комою одинарної точності і числа в форматі з плаваючою комою подвоєної точності наведені на малюнку
Малюнок 1. Формати числа з плаваючою комою
На малюнку буквою S позначений знак числа, 0 - це позитивне число, 1 - негативне число.
Група біт, позначена e призначена для запису зміщеного порядку числа. Зсув треба було, щоб не вводити в двійковий код числа з плаваючою комою ще один знак. Зміщений порядок завжди є позитивним числом. У двійковому коді одинарної точності float для запису порядку числа виділено вісім біт. Для нього зміщення порядку числа прийнято 127. Для зміщеного порядку в двійковому коді числа з плаваючою комою подвійної точності double відводиться 11 біт. У ньому зміщення порядку числа становить - 1023.
В десяткової мантисі після коми можуть бути присутніми цифри 1. 9, а в двійковій - тільки 1. Тому для зберігання одиниці після двійковій комою не виділяється окремий біт в числі з плаваючою комою. Одиниця мається на увазі, як і двоичная кома. Крім того, в форматі чисел з плаваючою комою прийнято, що мантиса завжди більше 1. Тобто діапазон значень мантиси лежить в діапазоні від 1 до 2.
Розглянемо кілька прикладів:
1) Визначити число з плаваючою комою, що лежить в чотирьох сусідніх байтах:
11000001 01001000 00000000 00000000
- Знаковий біт, що дорівнює 1 показує, що число негативне.
- Експонента 10000010 в десятковому вигляді відповідає числу 130. Віднявши число 127 з 130, отримаємо число 3.
- Тепер запишемо мантиссу: 1,100 1000 0000 0000 0000 0000
- І, нарешті, визначимо десяткове число: 1100,1b = 12,5d
2) Визначити число з плаваючою комою, що лежить в чотирьох сусідніх байтах:
11000011 00110100 00000000 00000000
- Знаковий біт, що дорівнює 1 показує, що число негативне.
- Експонента 10000110 в десятковому вигляді відповідає числу 134. Віднявши число 127 з 134, отримаємо число 7.
- Тепер запишемо мантиссу: 1,011 0100 0000 0000 0000 0000
- І, нарешті, визначимо десяткове число: 10110100b = 180d
Для того щоб записати нуль, в двійковому поданні числа з плаваючою комою достатньо записати в зміщений порядок число 00000000b. Значення мантиси при цьому не має значення. Число, в якому все байти рівні 0, теж потрапляє в цей діапазон значень.
Нескінченність в числі з плаваючою комою відповідає зміщеному порядку 11111111b і мантисі, дорівнює 1,0. При цьому існує мінус нескінченність і плюс нескінченність (переповнення і антипереполнение), які часто відображаються на екран монітора комп'ютера або дисплей мікропроцесорного пристрою як + INF і -INF.
Всі інші комбінації бітів мантиси числа з плаваючою комою (в тому числі і всі одиниці) при зміщеному порядку 11111111b сприймаються мовами програмування що не числа і відображаються на екран: NaN.
Інші види двійкових кодів: