Число с фиксированной запятой

Материал из Википедии — свободной энциклопедии

Число с фиксированной запятой (

целого числа
. При этом само число x и его целочисленное представление x′ связаны формулой

,

где z — цена (вес) младшего разряда.

В случае, если , для удобства расчётов его делают дольным единице, чтобы целые числа кодировались без погрешности. Другими словами, выбирают целое число u (машинную единицу) и принимают . В случае, если , его делают целым.

Если не требуется, чтобы какие-либо конкретные дробные числа входили в разрядную сетку, программисты обычно выбирают это позволяет использовать в операциях умножения и деления битовые сдвиги. Про такую арифметику говорят: «f битов на дробную часть, i=n−f — на целую» и обозначают как «i,f», «i.f» или «Qi.f» (см. числовой формат Q[англ.]). Например: арифметика 8,24 отводит на целую часть 8 бит и 24 — на дробную. Соответственно, она способна хранить числа от −128 до 128−z с ценой (весом) младшего разряда .

Для угловых величин зачастую делают (особенно если тригонометрические функции вычисляются по таблице).

Название

Название «фиксированная запятая» (или «фиксированная точка»; далее — ФЗ) произошло из-за простой метафоры: между двумя заранее определёнными разрядами ставится

запятая
для превращения целого числа в дробное. Например, целое число 1234 после вставки запятой превращается в дробное 12,34.

В Великобритании, США и других странах вместо запятой для отделения целой части числа от дробной используется точка, поэтому понятия «фиксированная точка» и «фиксированная запятая» эквивалентны.

Применение

Арифметику с фиксированной запятой часто применяют в тех областях, когда использование чисел с плавающей запятой затратно или невозможно ввиду используемой архитектуры процессоров. Например, видеосопроцессоры приставок

FPU
.

Кроме того, арифметику с фиксированной запятой используют для обеспечения минимальной поддержки дробных чисел на целочисленном процессоре:

СЛАУ
высокого порядка, фиксированной запятой зачастую достаточно — важно только подобрать подходящую цену (вес) младшего разряда для каждой из величин.

Числа с фиксированной запятой используют там, где не нужна высокая точность, но требуется производительность. В большинстве современных процессоров ФЗ аппаратно не реализована, но даже программная ФЗ очень быстра — поэтому она применяется в разного рода игровых движках, растеризаторах

движок Doom
для измерения расстояний использует арифметику Q16.16, для углов — 360°=232.

Также фиксированную запятую удобно использовать для записи чисел, которые по своей природе имеют постоянную

плавающую запятую с достаточным количеством знаков мантиссы — но тогда поле порядка становится излишним. Кроме того, фиксированная запятая ведёт себя абсолютно предсказуемо — при подсчёте денег это позволяет наладить разные виды округления, а в играх — наиболее простой способ реализовать многопользовательский
режим и запись повторов.

Недостатки

Недостаток фиксированной запятой — очень узкий диапазон чисел, с угрозой

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

Реализации

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

Числа с фиксированной запятой в формате

COBOL. Язык программирования Ada 2012 включает встроенную поддержку чисел с фиксированной запятой (как двоичных, так и десятичных) и чисел с плавающей запятой. JOVIAL и Coral 66
предоставляли оба формата.

Стандарт

GCC уже реализовали[3]
эту поддержку.

Практически все

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

Операции

Если операнды и результат имеют разную цену (вес) младшего разряда, формулы более сложны — но иногда такое приходится делать из-за большой разницы в порядке величин.

Для перевода чисел из формата с фиксированной запятой в человекочитаемый формат и наоборот применяются обычные правила перевода дробных чисел из одной позиционной системы счисления в другую.

Примечания

  1. Числа с фиксированной точкой. Применение в компьютерной графике. Дата обращения: 4 ноября 2007. Архивировано 24 ноября 2007 года.
  2. VI. FreeType outlines. Дата обращения: 23 марта 2020. Архивировано 11 июля 2020 года.
  3. Числа с фиксированной запятой Архивная копия от 29 мая 2015 на Wayback Machine. Документация GCC