Число з фіксованою комою

Число з фіксованою комою - формат представлення дійсного числа в пам'яті ЕОМ у вигляді цілого числа. При цьому саме число x і його цілочисельне уявлення x 'пов'язані формулою

x = x '\ cdot z ,

де z - ціна (вага) молодшого розряду.

Найпростіший приклад арифметики з фіксованою комою - переклад рублів в копійки. У такому випадку, щоб запам'ятати суму 12 рублів 34 копійки, ми записуємо в комірку пам'яті число 1234.

У випадку, якщо z <1 , Для зручності розрахунків роблять, щоб цілі числа кодировались без похибки. Іншими словами, обирають ціле число u (машинну одиницю) і приймають z = \ frac 1 u . У випадку, якщо z> 1 , Його роблять цілим.

Якщо не потрібно, щоб які-небудь конкретні дробові числа входили в розрядну сітку, програмісти зазвичай вибирають z = 2 ^ {-f} - це дозволяє використовувати в операціях множення і ділення бітові зрушення. Про таку арифметику кажуть: "f бітів на дробову частину, i = n-f - на цілу" і позначають як "i, f" або "i. F". Наприклад: арифметика 8,24 відводить на цілу частину 8 бітів і 24 - на дробову. Відповідно, вона здатна зберігати числа від -128 до 128 - z з ціною (вагою) молодшого розряду z = 2 ^ {-24} = 5 {,} 96 \ cdot 10 ^ {-8} .

Для кутових величин найчастіше роблять z = 2 \ pi \ cdot 2 ^ {-f} (Особливо якщо тригонометричні функції обчислюються по таблиці).


1. Назва

Назва "фіксована кома" сталося через простої метафори: між двома заздалегідь визначеними розрядами ставиться кома, перетворюючи, наприклад, ціле число 1234 у дробове 12,34.

Іноді говорять "фіксована точка" ( англ. fixed-point representation ): В англійській традиції ціла частина від дробової відокремлюється крапкою.

2. Застосування

  • Щоб забезпечити мінімальну підтримку дрібних чисел на целочисленном процесорі - мікроконтролера, мобільного телефону, приставок аж до Playstation і т. д. Якщо не вирішуються некоректні задачі і СЛАР високого порядку, фіксованою комою найчастіше досить - важливо тільки підібрати підходящу ціну (вага) молодшого розряду для кожної з величин.
  • Для прискорення обчислень в місцях, де не потрібна висока точність. У більшості сучасних процесорів ФЗ апаратно не реалізована, але навіть програмна ФЗ дуже швидка - тому вона застосовується в різного роду ігрових движках, растерізатор [1] і т. д. Наприклад, движок Doom для вимірювання відстаней використовує фіксовану кому 16,16, для вимірювання кутів - 360 = 65536.
  • Для запису чисел, які за своєю природою мають постійну абсолютну похибку: координати в програмах верстки, грошові суми. Наприклад, і здачу в супермаркеті, і податки в країні обчислюють з точністю до копійки. А файли метрики шрифтів TeX використовують 32-бітний знаковий тип з фіксованою комою (12,20). На подібні величини можна віддати і плаваючу кому з достатньою кількістю знаків мантиси - але тоді поле порядку стає зайвим.
  • Крім того, фіксована кома поводиться абсолютно передбачувано - при підрахунку грошей це дозволяє налагодити різні види округлення, а в іграх - найбільш простий спосіб реалізувати мультиплеер і запис повторів.

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


3. Реалізації

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

Числа з фіксованою комою у форматі BCD часто використовуються для збереження грошових величин - неточності від форматів з плаваючою комою неприпустимі, а простеньким мікроконтролерам платіжних терміналів BCD переважніше двійкового представлення. Історично, числа з фіксованою точкою часто використовувалися для десяткових типів даних, наприклад в мовах PL / I та COBOL. Мова програмування Ada включав вбудовану підтримку чисел з фіксованою комою (як двійкових, так і десяткових) і чисел з плаваючою комою. JOVIAL і Coral 66 також надавали обидва формати.

Стандант ISO / IEC TR 18037 описує підтримку чисел з фіксованою комою для мови Сі. Дана підтримка реалізована в компіляторі GCC [2], виробники інших компіляторів реалізують підтримку цих розширень пізніше.

Практично всі СУБД і мову SQL підтримують арифметику з фіксованою комою і зберігання таких даних. Наприклад, PostgreSQL має спеціальний чисельний тип для точного зберігання чисел до 1000 цифр.

Відео-співпроцесори приставок PlayStation ( Sony), Saturn ( Sega), Game Boy Advance ( Nintendo), Nintendo DS, GP2X використовують арифметику з фіксованою комою для того, щоб збільшити пропускну здатність на архітектурах без FPU.

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


4. Операції

  • Додавання і віднімання чисел з фіксованою комою - це звичайні додавання і віднімання: (X \ pm y) '= x' \ pm y '\, .
  • Множення і ділення відрізняються від цілочисельних на константу.
    (X \ cdot y) '= \ left [x' \ cdot y '\ cdot z \ right] = \ left [\ frac {x' \ cdot y '} u \ right]
    \ Left (\ frac xy \ right) '= \ left [\ frac {x'} {z \ cdot y '} \ right] = \ left [\ frac {x' \ cdot u} {y '} \ right] ,
    де [] - операція округлення до цілого. Зокрема, якщо в дробової частини f біт:
    (X \ cdot y) '= (x' \ cdot y ') \, \ operatorname {shr} \, f, \, \, \, \, \ left (\ frac xy \ right)' = \ frac {x '\, \ operatorname {shl} \, f} {y'} .
  • Для інших операцій, крім звичайних рядів Тейлора і ітераційних методів, широко застосовуються обчислення за таблицею.

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

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


Примітки

Перегляд цього шаблону Типи даних
Неінтерпретіруемие
Числові
Текстові
Покажчик

Адреса Посилання

Композитні
Інші

Логічний Нижчий тип Колекція Перераховуються тип Виняток First-class function Opaque data type Recursive data type Семафор Потік Вищий тип Type class Unit type Void

Пов'язані теми