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

Поделись знанием:
(перенаправлено с «Фиксированная запятая»)
Перейти к: навигация, поиск

Число с фиксированной запятой (англ. fixed-point number) — формат представления вещественного числа в памяти ЭВМ в виде целого числа. При этом само число x и его целочисленное представление x′ связаны формулой

<math>x = x' \cdot z</math>,

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

Простейший пример арифметики с фиксированной запятой — перевод рублей в копейки. В таком случае, чтобы запомнить сумму 12 рублей 34 копейки, мы записываем в ячейку памяти число 1234.

В случае, если <math>z<1</math>, для удобства расчётов делают, чтобы целые числа кодировались без погрешности. Другими словами, выбирают целое число u (машинную единицу) и принимают <math>z = \frac 1 u</math>. В случае, если <math>z>1</math>, его делают целым.

Если не требуется, чтобы какие-либо конкретные дробные числа входили в разрядную сетку, программисты обычно выбирают {{{1}}} это позволяет использовать в операциях умножения и деления битовые сдвиги. Про такую арифметику говорят: «f битов на дробную часть, i=n−f — на целую» и обозначают как «i,f», «i.f» или «Qi.f». Например: арифметика 8,24 отводит на целую часть 8 бит и 24 — на дробную. Соответственно, она способна хранить числа от −128 до 128−z с ценой (весом) младшего разряда <math>z = 2^{-24} = 5{,}96 \cdot 10^{-8}</math>.

Для угловых величин зачастую делают <math>z=2 \pi \cdot 2^{-f}</math> (особенно если тригонометрические функции вычисляются по таблице).





Название

Название «фиксированная запятая» (или «фиксированная точка»; далее — ФЗ) произошло из-за простой метафоры: между двумя заранее определёнными разрядами ставится запятая для превращения целого числа в дробное. Например, целое число 1234 после вставки запятой превращается в дробное 12,34.

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

Применение

  • Чтобы обеспечить минимальную поддержку дробных чисел на целочисленном процессоре — микроконтроллера, мобильного телефона, приставок вплоть до Playstation и т. д. Если не решаются некорректные задачи и СЛАУ высокого порядка, фиксированной запятой зачастую достаточно — важно только подобрать подходящую цену (вес) младшего разряда для каждой из величин.
  • Для ускорения вычислений в местах, где не требуется высокая точность. В большинстве современных процессоров ФЗ аппаратно не реализована, но даже программная ФЗ очень быстра — поэтому она применяется в разного рода игровых движках, растеризаторах[1] и т. д. Например, движок 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 уже реализовали[2] эту поддержку.

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

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

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

Операции

  • Сложение и вычитание чисел с фиксированной запятой — это обычные сложение и вычитание: <math>(x \pm y)' = x' \pm y'</math>.
  • Аналогично с умножением и делением на целочисленную константу: <math>(cx)' = c\cdot x'</math>.
  • Умножение и деление отличаются от целочисленных на константу.
    <math>(x \cdot y)' = \left[ x' \cdot y' \cdot z \right] = \left[ \frac {x' \cdot y'} u \right]</math>
    <math>\left(\frac x y \right)' = \left[ \frac {x'} {z \cdot y'} \right] = \left[ \frac {x' \cdot u} {y'} \right] </math>,
    где [ ] — операция округления до целого. В частности, если в дробной части f бит:
    <math>
  (x \cdot y)' = (x' \cdot y') \, \operatorname{shr} \, f, \,\,\,\,
  \left(\frac x y \right)' = \frac {x' \, \operatorname{shl} \, f} {y'}
 </math>.
  • Для других операций, помимо обычных рядов Тейлора и итерационных методов, широко применяются вычисления по таблице.

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

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

Напишите отзыв о статье "Число с фиксированной запятой"

Примечания

  1. [www.compgraphics.info/2D/fixed.php Числа с фиксированной точкой. Применение в компьютерной графике]
  2. [gcc.gnu.org/onlinedocs/gcc/Fixed-Point.html#Fixed-Point Числа с фиксированной запятой]. Документация GCC

Отрывок, характеризующий Число с фиксированной запятой

Так капитан рассказал трогательную историю своей любви к одной обворожительной тридцатипятилетней маркизе и в одно и то же время к прелестному невинному, семнадцатилетнему ребенку, дочери обворожительной маркизы. Борьба великодушия между матерью и дочерью, окончившаяся тем, что мать, жертвуя собой, предложила свою дочь в жены своему любовнику, еще и теперь, хотя уж давно прошедшее воспоминание, волновала капитана. Потом он рассказал один эпизод, в котором муж играл роль любовника, а он (любовник) роль мужа, и несколько комических эпизодов из souvenirs d'Allemagne, где asile значит Unterkunft, где les maris mangent de la choux croute и где les jeunes filles sont trop blondes. [воспоминаний о Германии, где мужья едят капустный суп и где молодые девушки слишком белокуры.]
Наконец последний эпизод в Польше, еще свежий в памяти капитана, который он рассказывал с быстрыми жестами и разгоревшимся лицом, состоял в том, что он спас жизнь одному поляку (вообще в рассказах капитана эпизод спасения жизни встречался беспрестанно) и поляк этот вверил ему свою обворожительную жену (Parisienne de c?ur [парижанку сердцем]), в то время как сам поступил во французскую службу. Капитан был счастлив, обворожительная полька хотела бежать с ним; но, движимый великодушием, капитан возвратил мужу жену, при этом сказав ему: «Je vous ai sauve la vie et je sauve votre honneur!» [Я спас вашу жизнь и спасаю вашу честь!] Повторив эти слова, капитан протер глаза и встряхнулся, как бы отгоняя от себя охватившую его слабость при этом трогательном воспоминании.
Слушая рассказы капитана, как это часто бывает в позднюю вечернюю пору и под влиянием вина, Пьер следил за всем тем, что говорил капитан, понимал все и вместе с тем следил за рядом личных воспоминаний, вдруг почему то представших его воображению. Когда он слушал эти рассказы любви, его собственная любовь к Наташе неожиданно вдруг вспомнилась ему, и, перебирая в своем воображении картины этой любви, он мысленно сравнивал их с рассказами Рамбаля. Следя за рассказом о борьбе долга с любовью, Пьер видел пред собою все малейшие подробности своей последней встречи с предметом своей любви у Сухаревой башни. Тогда эта встреча не произвела на него влияния; он даже ни разу не вспомнил о ней. Но теперь ему казалось, что встреча эта имела что то очень значительное и поэтическое.
«Петр Кирилыч, идите сюда, я узнала», – слышал он теперь сказанные сю слова, видел пред собой ее глаза, улыбку, дорожный чепчик, выбившуюся прядь волос… и что то трогательное, умиляющее представлялось ему во всем этом.
Окончив свой рассказ об обворожительной польке, капитан обратился к Пьеру с вопросом, испытывал ли он подобное чувство самопожертвования для любви и зависти к законному мужу.
Вызванный этим вопросом, Пьер поднял голову и почувствовал необходимость высказать занимавшие его мысли; он стал объяснять, как он несколько иначе понимает любовь к женщине. Он сказал, что он во всю свою жизнь любил и любит только одну женщину и что эта женщина никогда не может принадлежать ему.
– Tiens! [Вишь ты!] – сказал капитан.
Потом Пьер объяснил, что он любил эту женщину с самых юных лет; но не смел думать о ней, потому что она была слишком молода, а он был незаконный сын без имени. Потом же, когда он получил имя и богатство, он не смел думать о ней, потому что слишком любил ее, слишком высоко ставил ее над всем миром и потому, тем более, над самим собою. Дойдя до этого места своего рассказа, Пьер обратился к капитану с вопросом: понимает ли он это?
Капитан сделал жест, выражающий то, что ежели бы он не понимал, то он все таки просит продолжать.
– L'amour platonique, les nuages… [Платоническая любовь, облака…] – пробормотал он. Выпитое ли вино, или потребность откровенности, или мысль, что этот человек не знает и не узнает никого из действующих лиц его истории, или все вместе развязало язык Пьеру. И он шамкающим ртом и маслеными глазами, глядя куда то вдаль, рассказал всю свою историю: и свою женитьбу, и историю любви Наташи к его лучшему другу, и ее измену, и все свои несложные отношения к ней. Вызываемый вопросами Рамбаля, он рассказал и то, что скрывал сначала, – свое положение в свете и даже открыл ему свое имя.
Более всего из рассказа Пьера поразило капитана то, что Пьер был очень богат, что он имел два дворца в Москве и что он бросил все и не уехал из Москвы, а остался в городе, скрывая свое имя и звание.
Уже поздно ночью они вместе вышли на улицу. Ночь была теплая и светлая. Налево от дома светлело зарево первого начавшегося в Москве, на Петровке, пожара. Направо стоял высоко молодой серп месяца, и в противоположной от месяца стороне висела та светлая комета, которая связывалась в душе Пьера с его любовью. У ворот стояли Герасим, кухарка и два француза. Слышны были их смех и разговор на непонятном друг для друга языке. Они смотрели на зарево, видневшееся в городе.
Ничего страшного не было в небольшом отдаленном пожаре в огромном городе.
Глядя на высокое звездное небо, на месяц, на комету и на зарево, Пьер испытывал радостное умиление. «Ну, вот как хорошо. Ну, чего еще надо?!» – подумал он. И вдруг, когда он вспомнил свое намерение, голова его закружилась, с ним сделалось дурно, так что он прислонился к забору, чтобы не упасть.
Не простившись с своим новым другом, Пьер нетвердыми шагами отошел от ворот и, вернувшись в свою комнату, лег на диван и тотчас же заснул.


На зарево первого занявшегося 2 го сентября пожара с разных дорог с разными чувствами смотрели убегавшие и уезжавшие жители и отступавшие войска.
Поезд Ростовых в эту ночь стоял в Мытищах, в двадцати верстах от Москвы. 1 го сентября они выехали так поздно, дорога так была загромождена повозками и войсками, столько вещей было забыто, за которыми были посылаемы люди, что в эту ночь было решено ночевать в пяти верстах за Москвою. На другое утро тронулись поздно, и опять было столько остановок, что доехали только до Больших Мытищ. В десять часов господа Ростовы и раненые, ехавшие с ними, все разместились по дворам и избам большого села. Люди, кучера Ростовых и денщики раненых, убрав господ, поужинали, задали корму лошадям и вышли на крыльцо.
В соседней избе лежал раненый адъютант Раевского, с разбитой кистью руки, и страшная боль, которую он чувствовал, заставляла его жалобно, не переставая, стонать, и стоны эти страшно звучали в осенней темноте ночи. В первую ночь адъютант этот ночевал на том же дворе, на котором стояли Ростовы. Графиня говорила, что она не могла сомкнуть глаз от этого стона, и в Мытищах перешла в худшую избу только для того, чтобы быть подальше от этого раненого.
Один из людей в темноте ночи, из за высокого кузова стоявшей у подъезда кареты, заметил другое небольшое зарево пожара. Одно зарево давно уже видно было, и все знали, что это горели Малые Мытищи, зажженные мамоновскими казаками.
– А ведь это, братцы, другой пожар, – сказал денщик.
Все обратили внимание на зарево.