Нерухома кома
В інформатиці, число з нерухомою комою (англ. fixed-point number) — це представлення дійсного числа, що має фіксовану кількість чисел після (іноді перед) відокремлювальної коми. Представлення з нерухомою комою можна порівняти зі складнішим (і вимогливішим до обчислень) представлень з рухомою комою.
Числа з нерухомою комою корисні для подання дробових чисел, зазвичай з основою 2 або 10, коли центральний процесор не має математичного співпроцесора (англ. floating point unit, FPU) або нерухома кома має покращену швидкодію або точність. Найдешевші вбудовані мікропроцесори та мікроконтролери не мають співпроцесора.
Представлення
Значення в форматі нерухомої коми по суті цілочисельне змасштабоване на певний множник визначений типом. Наприклад, значення 1,23 можна подати як 1230 з множником 1/1000, також значення 1230000 можна представити як 1230 з множником 1000. На відміну від типів з рухомою комою, множник один і той самий для типу і не змінюється під час обчислень.
Зазвичай множник це ступінь 10 (для зручності сприймання людиною) або ступінь 2 (для швидкості обчислень). Однак, іноді можуть використовуватись й інші значення, наприклад, час можна представити як тип з нерухомою точкою із множником 1/3600 з ціллю обчислення значень з точністю до секунди.
Найбільше значення типу з нерухомою комою — це просто найбільше значення, яке може бути представлене підлеглим цілочисельним типом, помножене на множник; так само для найменшого значення. Наприклад, розглянемо тип з нерухомою комою представлений як двійкове ціле з b бітами в доповняльному коді, з множником 1/2f (що значить, останні f бітів складають дробові біти): найменше можливе для представлення значення — −2b-1/2f, а найбільше — (2b-1−1)/2f.
Застосування
- Щоб забезпечити мінімальну підтримку дробових чисел на процесорі, що підтримує лише цілі числа (наприклад, на мікроконтролері). Якщо не вирішуються некоректні задачі і СЛАР високого порядку, часто можна обійтися нерухомою комою — важливо тільки підібрати відповідну ціну (вагу) молодшого розряду для кожної з величин.
- Для прискорення обчислень в місцях, де не потрібна висока точність. У більшості сучасних[коли?] процесорів нерухома кома апаратно не реалізована, але навіть програмна нерухома кома дуже швидка — тому вона застосовується різного роду в ігрових рушіях, растеризаторах тощо. Наприклад, рушій Doom для вимірювання відстаней використовує фіксовану кому 16,16, для вимірювання кутів — 360°=65536.
- Для запису чисел, які за своєю природою мають постійну абсолютну похибку: координати в програмах верстки, позначки часу, грошові суми. Наприклад, здачу в супермаркеті, податки в країні обчислюють з точністю до копійки. А файли метрики шрифти TeX використовують 32-бітний рядковий тип з фіксованою комою (12,20). На подібні величини можна віддати і рухому кому з достатньою кількістю знаків мантиси — але тоді поле порядку стає зайвим.
- Крім того, кома фіксована веде себе абсолютно передбачувано — при підрахунку грошей це дозволяє налагодити різні види округлення, а в іграх — найпростіший спосіб реалізувати мультиплеєр і запис повторів.
Недолік нерухомої коми — дуже вузький діапазон чисел, з загрозою переповнення на одному кінці діапазону та втрати точності обчислень на іншому. Ця проблема призвела до винаходу рухомої коми. Наприклад: якщо потрібна точність у 3 значущих цифрах, 4-байтова кома фіксована дає діапазон в 6 порядків (тобто, різниця приблизно 106 між найбільшим і найменшим числом), 4-байтове число одинарної точності — в 70 порядків.
Реалізації
Деякі мови програмування надають вбудовану підтримку чисел з фіксованою комою, оскільки для більшості застосувань двійкове або десяткове представлення чисел з рухомою комою простіше і досить точно. Числа з рухомою комою простіше використовувати через їх більший динамічний діапазон, для них не потрібно попередньо задавати кількість цифр після коми. Якщо ж буде потрібно арифметиці з фіксованою комою, вона може бути реалізована програмістом навіть на мовах типу C і C++, які зазвичай не включають в себе такої арифметики.
Числа з нерухомою комою у форматі BCD часто використовуються для зберігання грошових величин — неточності від форматів з рухомою комою неприпустимі, а простенькі мікроконтролери платіжних терміналів BCD кращі за двійкове подання. Історично, числа з нерухомою комою часто використовувалися для десяткових типів даних, наприклад у мовах PL/I і COBOL. Мова програмування Ada 2012 включає вбудовану підтримку чисел з нерухомою комою (як двійкових, так і десяткових чисел з рухомою комою. JOVIAL і Coral 66 надавали обидва формати.
Стандарт ISO/IEC TR 18037 додає підтримку чисел з фіксованою комою в мову C. Розробники компілятора GCC вже реалізували цю підтримку.
Практично всі СУБД і мова SQL підтримують арифметику з фіксованою комою і зберігання таких даних. Наприклад, PostgreSQL має спеціальний чисельний тип для точного зберігання чисел до 1000 цифр.
Відео-співпроцесори приставок PlayStation (Sony), Saturn (Sega), Game Boy Advance (Nintendo), Nintendo DS, GP2X використовують арифметику з фіксованою комою для того, щоб збільшити пропускну здатність на архітектурах без FPU.
Стандарт OpenGL ES 1.x включає підтримку чисел з фіксованою комою, так як він створений для вбудованих систем, у яких часто немає FPU.
Операції
- Додавання і віднімання чисел з нерухомою комою — це звичайні додавання і віднімання: ,.
- Аналогічно з множенням і діленням на цілочисельну константу: .
- Множення і ділення відрізняються від цілочисельних на константу.
=
де [ ] — операція округлення до цілого. Зокрема, якщо в дробовій частині f біт:
- Для інших операцій, крім звичайних рядів Тейлора і ітераційних методів, широко застосовуються обчислення за таблицею.
Якщо операнди і результат мають різну ціну (вагу) молодшого розряду, формули більш складні — але іноді доводиться робити через велику різницю в порядку величин.
Для переведення чисел із формату з нерухомою комою у звичайний формат і навпаки застосовуються звичайні правила переведення десяткових чисел з однієї позиційної системи числення в іншу.
Посилання
- Арифметика з нерухомою комою — Вступ Представлення і втілення арифметики з нерухомою комою в обробці цифрових сигналів, Ренді Ятс (англ.)