Існує численні способи зберігання дробових чисел, і кожен з них має свої переваги та недоліки.
Плаваюча точка - це, безумовно, найпопулярніший формат. Він працює, кодуючи знак, мантісу та підписаний показник бази-2 у цілі числа, і упаковуючи їх у купу біт. Наприклад, у вас може бути 32-розрядна мантіса 0.5
(закодована як 0x88888888
) та 32-розрядний підписаний експонент +3
( 0x00000003
), який би декодувався до 4.0
(0.5 * 2 ^ 3
). Числа з плаваючою комою швидкі, оскільки вони реалізовані апаратно, а їхні шкали точності з абсолютним розміром, тобто чим менше число, тим краща ваша абсолютна точність, тому відносна похибка округлення залишається постійною з абсолютним розміром. Поплавці відмінно підходять для значень, відібраних з безперервної області, таких як довжини, рівні звукового тиску, рівні освітленості тощо, і тому вони зазвичай використовуються для обробки звуку та зображень, а також для статистичного аналізу та фізичного моделювання. Їх найбільшим недоліком є те, що вони не точні, тобто схильні до помилок округлення, і вони не можуть точно представити всі десяткові дроби. Усі основні мови програмування мають певну точку з плаваючою точкою.
Фіксована точкапрацює, використовуючи досить великі цілі числа та неявно резервуючи частину їхніх бітів для дробової частини. Наприклад, 24,8-бітове число з фіксованою точкою резервує 24 біти для цілої частини (включаючи знак) і 8 біт для дробової частини. Праворучне зміщення цього числа на 8 біт дає нам цілу частину. Номери з фіксованою точкою, які раніше були популярними, коли апаратні одиниці з плаваючою комою були рідкісними або принаймні набагато повільнішими, ніж їхні цілі аналоги. Хоча цифри з фіксованою точкою дещо простіше в обробці з точки зору точності (хоча б тому, що про них легше обґрунтувати), вони поступаються плаванню в майже будь-якому іншому відношенні - вони мають меншу точність, менший діапазон і тому, що додаткові операції, необхідні для виправлення розрахунків для неявного зсуву, математика з фіксованою точкою сьогодні часто повільніше, ніж математика з плаваючою комою.
Десяткові типи працюють так само, як числа з плаваючою чи фіксованою точкою, але вони припускають десяткову систему, тобто їхній показник (неявний або явний) кодує потужність 10, а не потужність-2. Десяткове число може, наприклад, кодувати мантісу 23456
та показник -2
, і це пошириться на234.56
. Десяткові знаки, оскільки арифметика не є провідним в процесорі, повільніше, ніж плаваючі, але вони ідеальні для всього, що включає десяткові числа і потребує цих чисел, щоб бути точними, а округлення відбувається в чітко визначених місцях - фінансові розрахунки, табло тощо. У деяких мовах програмування вбудовані десятичні типи (наприклад, C #), для інших потрібні бібліотеки для їх реалізації. Зауважимо, що хоча десяткові знаки можуть точно представляти десяткові дроби, що не повторюються, їх точність не краща, ніж цифри з плаваючою комою; вибір десяткових знаків означає, що ви отримуєте точні подання чисел, які можна точно представити у десятковій системі (подібно до того, як поплавці можуть точно представляти двійкові дроби).
Раціональні числа зберігають чисельник і чисельник, як правило, використовуючи якийсь тип цілого чисел bignum (числовий тип, який може зростати настільки, наскільки дозволяють обмеження пам'яті комп'ютера). Це єдиний тип даних із групи, який може точно моделювати числа, як-от 1/3
або 3/17
, а також операції над ними - раціональні, на відміну від інших типів даних, дадуть правильні результати для таких речей, як3 * 1/3
. Математика досить проста, хоча придумати ефективний алгоритм факторингу є досить складним завданням. У деяких мовах програмування вбудовані раціональні типи (наприклад, Common Lisp). Недоліки раціоналів включають те, що вони повільні (багато операцій вимагають зменшення дробів та розподілення їх компонентів), а також, що багато загальних операцій важко або неможливо здійснити, і більшість реалізацій знизить раціональний до плаваючого, коли це станеться (наприклад, коли ви телефонуєте sin()
на раціональне).
BCD (Binary Coded Decimal) використовує "nibbles" (групи по 4 біти) для кодування окремих цифр; Оскільки nibble може містити 16 різних значень, але десяткових чисел вимагає лише 10, то на nibble існує 6 "незаконних" значень. Як і десяткові знаки, цифри BCD є десятковими, тобто обчислення, проведені на десяткових числах, виходять так само, як і у випадку, коли ви робили їх за допомогою ручки та паперу. Арифметичні правила для BCD дещо незграбні, але перелом полягає в тому, що перетворити їх у рядки простіше, ніж у деяких інших форматах, що особливо цікаво для середовищ з низьким рівнем ресурсів, таких як вбудовані системи.
Рядки , так, звичайні старі рядки, також можна використовувати для представлення дробових чисел. Технічно це дуже схоже на BCD, тільки що є явна десяткова крапка, і ви використовуєте один повний байт на десяткову цифру. Як такий, формат марнотратний (використовується лише 11 з 256 можливих значень), але його простіше проаналізувати та генерувати, ніж BCD. Крім того, оскільки всі використовувані значення "неподозрілі", нешкідливі та нейтральні для платформи номери, кодовані рядками, можуть без проблем пересуватись по мережах. Нечасто знайти арифметику, що робиться на рядках безпосередньо, але можливо, і коли ви це зробите, вони настільки ж точні, як і в інших десяткових форматах (десяткових знаків і BCD).