Нерухома кома

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

В інформатиці, число з нерухомою комою (англ. 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[en] для вимірювання відстаней використовує фіксовану кому 16,16, для вимірювання кутів — 360°=65536.
  • Для запису чисел, які за своєю природою мають постійну абсолютну похибку: координати в програмах верстки, позначки часу[en], грошові суми. Наприклад, здачу в супермаркеті, податки в країні обчислюють з точністю до копійки. А файли метрики шрифти TeX використовують 32-бітний рядковий тип з фіксованою комою (12,20). На подібні величини можна віддати і плаваючу кому з достатньою кількістю знаків мантиси — але тоді поле порядку стає зайвим.
  • Крім того, кома фіксована веде себе абсолютно передбачувано — при підрахунку грошей це дозволяє налагодити різні види округлення, а в іграх — найпростіший спосіб реалізувати мультиплеєр і запис повторів.

Недолік нерухомої коми — дуже вузький діапазон чисел, з загрозою переповнення на одному кінці діапазону та втрати точності обчислень на іншому. Ця проблема призвела до винаходу плаваючої коми. Наприклад: якщо потрібна точність у 3 значущих цифрах, 4-байтова кома фіксована дає діапазон в 6 порядків (тобто, різниця приблизно 106 між найбільшим і найменшим числом), 4-байтове число одинарної точності — в 70 порядків.

Реалізації[ред.ред. код]

Деякі мови програмування надають вбудовану підтримку чисел з фіксованою комою, оскільки для більшості застосувань двійкове або десяткове представлення чисел з плаваючою комою простіше і досить точно. Числа з плаваючою комою простіше використовувати через їх більший динамічний діапазон, для них не потрібно попередньо задавати кількість цифр після коми. Якщо ж буде потрібно арифметиці з фіксованою комою, вона може бути реалізована програмістом навіть на мовах типу C і C++, які зазвичай не включають в себе такої арифметики.

Числа з нерухома нерухомою комою у форматі BCD часто використовуються для зберігання грошових величин — неточності від форматів з плаваючою комою неприпустимі, а простенькі мікроконтролери платіжних терміналів BCD краще двійкового подання. Історично, числа з нерухомою комою часто використовувалися для десяткових типів даних, наприклад у мовах PL/I[ru]і 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[ru] використовують арифметику з фіксованою комою для того, щоб збільшити пропускну здатність на архітектурах без FPU.

Стандарт OpenGL ES 1.x включає підтримку чисел з фіксованою комою, так як він створений для вбудованих систем, у яких часто немає FPU.

Операції[ред.ред. код]

  • Додавання і віднімання чисел з нерухомою комою — це звичайні додавання і віднімання: ,.
  • Аналогічно з множенням і діленням на цілочисельну константу: .
  • Множення і ділення відрізняються від цілочисельних на константу.

=

де [ ] — операція округлення до цілого. Зокрема, якщо в дробовій частині f біт:

  • Для інших операцій, крім звичайних рядів Тейлора і ітераційних методів, широко застосовуються обчислення за таблицею.

Якщо операнди і результат мають різну ціну (вагу) молодшого розряду, формули більш складні — але іноді доводиться робити з-за великої різниці в порядку величин.

Для переведення чисел із формату з нерухомою комою у звичайний формат і навпаки застосовуються звичайні правила переведення десяткових чисел з однієї позиційної системи числення в іншу.

Посилання[ред.ред. код]