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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

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

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

«Плаваюча кома» та «плаваюча точка»[ред.ред. код]

Оскільки в деяких, переважно англомовних та англофікованих країнах (див. докладний список Decimal separator (англ.)) при запису чисел ціла частина відділяється від дробовою точкою, то в термінології цих країн фігурує назва «плаваюча точка» (floating point (англ.)). Оскільки в Україні ціла частина числа від дробової традиційно відділяється комою, то для позначення того ж поняття історично використовується термін «плаваюча кома», проте в літературі та технічній документації можна зустріти обидва варіанти.

Походження назви[ред.ред. код]

Назва «плаваюча кома» походить від того, що кома в позиційному поданні числа (десяткова кома, або, для комп'ютерів, двійкова кома — далі по тексту просто кома) може бути поміщена де завгодно щодо цифр в рядку. Це положення коми вказується окремо у внутрішньому поданні. Таким чином, подання числа у формі з плаваючою комою може розглядатися як комп'ютерна реалізація експоненційного запису чисел.

Перевага використання подання чисел у форматі з плаваючою комою над використанням у форматі з фіксованою комоюцілими числами) полягає в тому, що можна використовувати істотно більший діапазон значень при незмінній відносній точності. Наприклад, у формі з фіксованою коми число, що займає 8 розрядів в цілій частині і 2 розряду після коми, може бути представлено у вигляді 123456,78; 8765,43; 123,00 і так далі. У свою чергу, у форматі з плаваючою комою (в тих же 8 розрядах) можна записати числа 1,2345678; 1234567,8; 0,000012345678; 12345678000000000 і так далі, але для цього необхідно двухрозрядне додаткове поле для запису показників ступеня 10 від 0 до 1610, при цьому загальне число розрядів складе 8+2=10.

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

Структура числа[ред.ред. код]

Число з плаваючою комою складається з:

  • Знака мантиси (вказує на негативних чи позитивних числа)
  • Мантису (виражає значення числа без урахування порядку[en])
  • Знака порядку
  • Порядку (виражає ступінь основи числа, на яке множиться мантиса)

Нормальна форма та нормалізована форма[ред.ред. код]

Нормальною формою числа з плаваючою комою називається така форма, в якій мантиса (без урахування знака) знаходиться на півінтервалі [0; 1) (0\leqslant a<1). Число з плаваючою комою, що розташоване не в нормальної формі, втрачає точність у порівнянні з нормальною формою.[джерело не вказано 1951 день] Така форма запису має недолік: деякі числа записуються неоднозначно (наприклад, 0,0001 можна записати в 4 формах — 0,0001×100, 0,001×10-1, 0,01×10-2, 0,1×10-3), тому поширена (особливо в інформатиці) також інша форма записи — нормалізована, в якій мантиса десяткового числа приймає значення від 1 (включно) до 10 (НЕ включно), а мантиса двійкового числа приймає значення від 1 (включно) до 2 (НЕ включно) (1\leqslant a<q). У такій формі будь-яке число (крім 0) записується єдиним чином. Недолік полягає в тому, що в такому вигляді неможливо отримати 0, тому представлення чисел в інформатиці передбачає спеціальний ознаку (біт) для числа 0.

Оскільки старший розряд (ціла частина числа) мантиси двійкового числа (крім 0) в нормалізованому вигляді дорівнює «1», то при записі мантиси числа в ЕОМ старший розряд годі й записувати, що і використовується в стандарті IEEE 754. В позиційних системах числення з основою більшим, ніж 2 (в трійковій, четвериковій і інших), цієї властивості немає.

Використання в обчислювальних машинах[ред.ред. код]

В обчислювальних машинах показник ступеня прийнято відокремлювати від мантиси літерою «E» (exponent). Наприклад, число 1,528535047×10-25 в більшості мов програмування високого рівня записується як 1.528535047E-25.

Короткий огляд[ред.ред. код]

Існує кілька способів того, як рядки з цифр можуть представляти числа:

  • Найбільш поширений шлях подання значення числа з рядка з цифрами — у вигляді цілого числа — кома (radix point) за замовчуванням розташований наприкінці рядка.
  • Загалом, в математичному поданні рядок з цифр може мати яку завгодно довжину, а положення коми позначається шляхом явного записи символу коми (або, на Заході, крапки) в потрібному місці.
  • У системах з поданням чисел у форматі з фіксованою комою існує певна умова щодо положення коми. Наприклад, в рядку з 8 цифр умова може вказувати положення коми в середині запису (між 4-й і 5-й цифрою). Таким чином, рядок «00012345» позначає число 1,2345 (нулі ліворуч завжди можна відкинути).
  • В експоненційної запису використовують стандартний (нормалізований) вид представлення чисел. Число вважається записаним в стандартному (нормалізованому) вигляді, якщо воно записане у вигляді aq^n, де a, зване мантисою, таке, що 1\leqslant a<q, n — ціле, називається показником ступеня та q — ціле, основу системи числення (на письмі це зазвичай 10). Тобто у мантиси кома поміщається одразу після першої значущої (не дорівнює нулю) цифри, рахуючи з ліва направо, а подальший запис дає інформацію про дійсне значення числа. Наприклад, період обертання (на орбіті) супутника Юпітера Іо, який дорівнює 152853,5047 с, в стандартному вигляді можна записати як 1,528535047×105 с. Побічним ефектом обмеження на значення мантиси є те, що в такому записі неможливо зобразити число 0.
  • Запис з плаваючою комою схожий на запис чисел в стандартному вигляді, але мантиса та експонента записуються роздільно. Запис з плаваючою комою схожий на запис чисел в стандартному вигляді, але мантиса та експонента записуються роздільно. Повертаючись до прикладу з Іо, запис у формі з плаваючою комою буде 1528535047 з показником 5. Це означає, що записане число в 105 разів більше числа 1,528535047, тобто для отримання потрібного числа кома зсувається на 5 розрядів вправо. Однак, запис у формі з плаваючою комою використовується переважно в електронному поданні чисел, при якому використовується основа системи числення 2, а не 10. Крім того, в двійковій системі запису мантиса зазвичай денормалізована, тобто кома йде до першої цифри, а не після, і ціла частини взагалі не розглядається — так з'являється можливість значення 0 зберегти природним чином. Таким чином, десяткова 9 в двійковому представленні з плаваючою комою буде записана як мантиса +1001000… 0 і показник +0… 0100. Звідси, наприклад, біди з двійковим поданням чисел типу однієї десятої (0,1), для якої двійкове подання мантиси виявляється періодичним двійковим дробом — за аналогією з дробом 1/3, який не можна записати з кінцевою кількістю цифр в десятковій системі числення.

Запис числа у формі з плаваючою комою дозволяє робити обчислення над широким діапазоном величин, поєднуючи фіксовану кількість розрядів та точність. Наприклад, у десятковій системі подання чисел з плаваючою комою (3 розряду) операцію множення, яка запишется так:

0,12 × 0,12 = 0,0144

в нормальній формі представляється у вигляді: (1,20×10-1) × (1,20×10-1) = (1,44×10-2). У форматі з фіксованою комою ми б отримали вимушене округлення

0,120 × 0,120 = 0,014.

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

Діапазон чисел, які представлені у форматі з плаваючою комою[ред.ред. код]

Діапазон чисел, які можна записати даними способом, залежить від кількості біт, відведених для подання мантиси та показника. На звичайній 32-бітній обчислювальній машині, що використовує подвійну точність (64 біта), мантиса становить 1 біт знак + 52 біта, показник — 1 біт знак + 10 біт. Таким чином отримуємо діапазон точності приблизно від 4,94×10-324 до 1.79×10308 (від 2−52 × 2−1022 до ~ 1 × 21024). Пара значень показника зарезервована для забезпечення можливості подання спеціальних чисел. До них належать значення NaN (Not a Number, що не число) і +/-INF (Infinity, нескінченність), які утворюються внаслідок операцій типу ділення на нуль нуля, позитивних та негативних чисел. Також сюди потрапляють денормалізовані числа, у яких мантиса менше одиниці. У спеціалізованих пристроях (наприклад GPU) підтримка спеціальних чисел часто відсутня. Існують програмні пакети, в яких обсяг пам'яті виділений під мантису та показник задається програмно, і обмежується лише обсягом доступної пам'яті ЕОМ.


Точність Одинарна Подвійна Розширена
Розмір (байти) 4 8 10
Число десяткових знаків ~7.2 ~15.9 ~ 19.2
Найменше значення (>0), denorm 1,4×10-45 5,0×10-324 1,9×10-4951
Найменше значення (>0), normal 1,2×10-38 2,3×10-308 3,4×10-4932
Найбільше значення 3,4 ×10+38 1,7 ×10+308 1,1 ×10+4932
Поля S-E-F S-E-F S-E-I-F
Розміри полів 1-8-23 1-11-52 1-15-1-63
  • S — знак, E — показник ступеня, I — ціла частина, F — дробова частина
  • Так само, як і для цілих, знаковий біт — старший.

Машинний епсилон[ред.ред. код]

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

Машинним епсилоном називається найменше позитивне число ε таке, що 1 \oplus \varepsilon \neq 1 (знаком \oplus позначено машинне додавання). Грубо кажучи, числаa і b, співвідносяться так, що 1 < \frac a b < 1+\varepsilon, машина не розрізняє.

Див. також[ред.ред. код]

Література[ред.ред. код]

  • Н. А. Криницький, Г. А. Миронов, Г. Д. Фролов Програмування. — М.: Державне видавництво фізико-математичної літератури, 1963. — 384 с.
  • Генрі С. Уоррен, мл. Глава 15. Числа з плаваючою точкою // Алгоритмічні трюки для програмістів = Hacker's Delight. — М.: Вільямс, 2007. — С. 288. — ISBN 0-201-91465-4.