For faster navigation, this Iframe is preloading the Wikiwand page for Число с фиксированной запятой.

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

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

Число с фиксированной запятой (англ. fixed-point number) — формат представления вещественного числа в памяти ЭВМ в виде целого числа. При этом само число 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.

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

Применение

[править | править код]

Арифметику с фиксированной запятой часто применяют в тех областях, когда использование чисел с плавающей запятой затратно или невозможно ввиду используемой архитектуры процессоров. Например, видеосопроцессоры приставок PlayStation (Sony), Saturn (Sega), Game Boy Advance (Nintendo), Nintendo DS, GP2X используют арифметику с фиксированной запятой для того, чтобы увеличить пропускную способность на архитектурах без FPU. Стандарт OpenGL ES 1.x включает поддержку чисел с фиксированной запятой, так как он создан для встраиваемых систем, у которых часто нет FPU.

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

Числа с фиксированной запятой используют там, где не нужна высокая точность, но требуется производительность. В большинстве современных процессоров ФЗ аппаратно не реализована, но даже программная ФЗ очень быстра — поэтому она применяется в разного рода игровых движках, растеризаторах[1] и т. д. Например, движок Doom для измерения расстояний использует арифметику Q16.16, для углов — 360°=232.

Также фиксированную запятую удобно использовать для записи чисел, которые по своей природе имеют постоянную абсолютную погрешность: координаты в программах вёрстки, отметки времени, денежные суммы. Например, и сдачу в супермаркете, и налоги в стране вычисляют с точностью до сотой доли. Файлы метрики шрифтов TeX используют 32-битный знаковый тип с фиксированной запятой Q12.20, библиотека растеризации шрифтов FreeType — Q26.6[2]. На подобные величины можно отдать и плавающую запятую с достаточным количеством знаков мантиссы — но тогда поле порядка становится излишним. Кроме того, фиксированная запятая ведёт себя абсолютно предсказуемо — при подсчёте денег это позволяет наладить разные виды округления, а в играх — наиболее простой способ реализовать многопользовательский режим и запись повторов.

Недостатки

[править | править код]

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

Реализации

[править | править код]

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

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

Стандарт ISO/IEC TR 18037 добавляет поддержку чисел с фиксированной запятой в язык C. Разработчики компилятора GCC уже реализовали[3] эту поддержку.

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

  • Сложение и вычитание чисел с фиксированной запятой — это обычные сложение и вычитание: .
  • Аналогично с умножением и делением на целочисленную константу: .
  • Умножение и деление отличаются от целочисленных на константу.
    ,
    где [ ] — операция округления до целого. В частности, если в дробной части f бит:
    .
  • Для других операций, помимо обычных рядов Тейлора и итерационных методов, широко применяются вычисления по таблице.

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

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

Примечания

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

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?