Запись числа с фиксированной точкой

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

x = x ′ ⋅ z <displaystyle x=x’cdot z> ,

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

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

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

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

Содержание

Название [ править | править код ]

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

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

Применение [ править | править код ]

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

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

Реализации [ править | править код ]

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

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

Читайте также:  Как открыть файл xsd вышивки крестом

Стандарт 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.

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

  • Сложение и вычитание чисел с фиксированной запятой — это обычные сложение и вычитание: ( x ± y ) ′ = x ′ ± y ′ <displaystyle (xpm y)’=x’pm y’>.
  • Аналогично с умножением и делением на целочисленную константу: ( c x ) ′ = c ⋅ x ′ <displaystyle (cx)’=ccdot x’>.
  • Умножение и деление отличаются от целочисленных на константу. ( x ⋅ y ) ′ = [ x ′ ⋅ y ′ ⋅ z ] = [ x ′ ⋅ y ′ u ] <displaystyle (xcdot y)’=left[x’cdot y’cdot z
    ight]=left[<frac >
    ight]>( x y ) ′ = [ x ′ z ⋅ y ′ ] = [ x ′ ⋅ u y ′ ] <displaystyle left(<frac >
    ight)’=left[<frac >
    ight]=left[<frac >
    ight]>, где [ ] — операция округления до целого. В частности, если в дробной части f бит: ( x ⋅ y ) ′ = ( x ′ ⋅ y ′ ) shr f , ( x y ) ′ = x ′ shl f y ′ <displaystyle (xcdot y)’=(x’cdot y’),operatorname ,f,,,,,left(<frac
    >
    ight)’= <frac >>.
  • Для других операций, помимо обычных рядов Тейлора и итерационных методов, широко применяются вычисления по таблице.

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

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

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

Пример. Ячейка с целой и дробной частью.

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

Пример. Ячейка с записью целого числа.

К достоинствам использования чисел с фиксированной точкой относятся простота выполнения арифметических операций и высокая точность изображения чисел. К недостаткам — небольшой диапазон представления чисел.

3.2 Числа с плавающей точкой

Для представления чисел с плавающей точкой (ЧПТ) используется полулогарифмическая форма записи числа:

где q— основание системы счисления, p — порядок числа, m — мантисса числа N.

Положение точки определяется значением порядка p. С изменением порядка точка перемещается (плавает) влево или вправо. Пример.

12510=12.5*10 1 =1.25*10 2 =0.125*10 3 =0.0125*10 4 =.

Для установления однозначности при записи чисел принята нормализованная форма записи числа. Мантисса нормализованного числа может изменяться в диапазоне: 1/q ≤ | m | 10

Максимальным числом представимым в формате слова будет A=(0.1111. 1·10 1111111 )2(1·2 127 )10.

Таким образом, числа с плавающей точкой позволяют увеличить диапазон обрабатываемых чисел, но при этом точность изображения чисел определяется только разрядами мантиссы и уменьшается по сравнению с числами с фиксированной точкой. При записи числа в формате слова диапазон представимых чисел будет от -1·2 127 до 1·2 127 (2 127 10 38 ), а точность определяться мантиссой, состоящей из 23 разрядов. Точность может быть повышена путем увеличения количества разрядов мантиссы. Это реализуется путем представления чисел с так называемой двойной точностью (используется формат двойного слова):

3.3. Особенности нормальной формы в ес эвм

Особенностями нормальной формы в ЕС ЭВМ яв­ляются следующие:

Читайте также:  Микрокод процессора в биос

1. Смещение числовой оси порядков в область по­ложительных значений для облегчения действий над порядками, не имеющими знака. Обычно 7 разрядов (схема 8) отводится под значение порядка и его знак.

Следовательно, числовая ось порядков находится в диапазоне -2 6 6 -1 или -64 6 == 6410 =4016. В этом случае характеристика Рх = Р + 40 не имеет знака.

Теперь характеристика может принимать значения в диапазоне

и под ее значение, как уже было сказано, отводятся 7 разрядов (максимальное значение порядка 2 7 -1 =127). Очевидно, если Рх = 40, то Р = 0, если Рх 40 — поря­док положительный Р > 0. Если Рх 7F, то значение характеристики пропадает и результаты ис­кажаются.

2. Мантиссы и порядки чисел выражаются в шест­надцатиричной системе счисления в двоичном виде, что обеспечивает увеличение диапазона представле­ния чисел, так как изменение характеристики на 1 при­водит к сдвигу мантиссы на одну шестнадцатиричную цифру, т. е. сразу на одну двоичную тетраду. Действи­тельно, если в формулу (1.7) подставить s = 16, то

Таким образом, значение порядка увеличилось в 4 раза.

Представим в 32 разрядной сетке формата два числа (знак обозначает равенство чисел в разных системах счисления):

Для этого найдем нормализованные мантиссы и характеристики:

mB = -0,7D08,8, pxb = 40 + 4 = 44 (схема 1). Здесь так же, как и при естественной форме хра­нения числа, его знак определяется по первой шестна­дцатиричной цифре кода.

Таким образом две первые шестнадцатиричные цифры кода числа с плавающей запятой определяют характеристику Рх с учетом знака числа (0 или 1 в стар­шем разряде первой двоичной тетрады). Для положи­тельных чисел две первые шестнадцатиричные цифры кода числа образуются как сумма Рх + 00(16), а для отри­цательных — Рх + 80(16).

Представим в разрядной сетке (см. схему 2) два других числа: С(10)= 0,015625

Для этого найдем нормализованные мантиссы, по­рядки и характеристики этих чисел:

По шестнадцатиричному коду числа с плавающей запятой нетрудно определить и само десятичное число. Рассмотрим примеры кодов чисел, представленных на схемах 1 и 2.

А(10) = 7 • 16 3 + 13 • 16 2 + 8 • 16 0 + 8 • 16 -1 =

= 28672 + 3328 + 8 + 0,5 == 32008,5.

Характеристика с учетом знака = С4, первая цифра С > 7. Поэтому, число отрицательное, ха­рактеристика Pхв = C4(16)-80(16) = 44(16), порядок чи­сла РB = 44(16)-40(16) = 4(16), а мантисса числа mB == = -0,7D088(16). Вычисления аналогичны, следователь­но, B(16) = -7D08,8, a B(10) = -32008,5.

Характеристика с учетом знака == 3F, первая ци­фра 3 Pc = 0,4- 16 -1 == 0,04(16). Следовательно, С(10) = 4 • 16 -2 = 0,015625.

Характеристика с учетом знака = ВF, первая ци­фра В > 7. Поэтому, число отрицательное, характери­стика Pxd = BF(16)-80(16) = 3F(16), порядок числа РD = = 3F(16)-40(16) = -l(16), а мантисса числа тD = -0,4(16). Таким образом, число D(16) = mD • 16 PD = -0,4 • 16 -1 = = -0,04(16).

Следовательно, D(16) = -4 • 16 -2 = —0,015625.

Представление чисел в ЭВМ

1. Общие сведения

При проектировании ЭВМ, создании инструментального и прикладного программного обеспечения разработчикам приходится решать вопрос о представлении в ЭВМ числовых данных. Для решения большинства прикладных задач обычно достаточно использовать целые и вещественные числа. Запись целочисленных данных в запоминающем устройстве ЭВМ не представляет затруднений: число переводится в двоичную систему и записывается в прямом коде. Диапазон представляемых чисел в этом случае ограничивается количеством выделенных для записи разрядов. Для вещественных данных обычно используются две формы записи: число с фиксированной точкой (ЧФТ) и число с плавающей точкой (ЧПТ).

Память ЭВМ построена из запоминающих элементов, обладающих двумя устойчивыми состояниями, одно из которых соответствует нулю, а другое — единице. Таким физическим элементом представляется в памяти ЭВМ каждый разряд двоичного числа (бит). Совокупность определенного количества эти элементов служит для представление многоразрядных двоичных чисел и составляет разрядную сетку ЭВМ.

Каждая группа из 8-ми запоминающих элементов (байт) пронумерована. Номер байта называется его адресом. Определенное число последовательно расположенных байт называется словом. Для разных ЭВМ длина слова различна — два, четыре или восемь байт. (Мне думается, что это зависит от разрядности процессора).

2. Числа с фиксированной точкой

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

Читайте также:  Pci ven 1022 dev 1537 subsys 104b1025

Пример.
Ячейка с целой и дробной частью.

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

Пример.
Ячейка с записью целого числа.

К достоинствам использования чисел с фиксированной точкой относятся простота выполнения арифметических операций и высокая точность изображения чисел. К недостаткам — небольшой диапазон представления чисел.

При представлении в ЭВМ чисел в естественной форме устанавливается фиксированная длина разрядной сетки. При этом распределение разрядов между целой и дробной частями остается неизменным для любых чисел. В связи с эти в информатике существует другое название естественной формы представления чисел — с фиксированной точкой (запятой).

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

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

Обычно целые числа в ЭВМ занимают один, два или четыре байта. Один, как правило, старший бит отводится под знак числа. Знак положительного числа "+" кодируется нулем, а знак отрицательного числа "-" — единицей. Целые числа без знака в двух байтовом формате могут принимать значения от 0 до 2 16 -1 (до 65535), а со знаком "-" от -2 15 до 2 15 -1, то есть от -32768 до 32767.

Во всех разрядах всегда должно быть что-то записано, даже если это "незначащий" ноль. Число распологается так, что его самый младший двоичный разряд записывается в крайний првый бит разрядной сетки. Например, десятичное число 19 (100112) в 16-разрядной сетке записывается так:

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

Существенным недостатком машин с фиксированной точкой является конечный диапазон представления величин. Может показаться, что это ограничивает вычислительные возможности ЭВМ. Но на самом деле короткая длина слова приводит только к снижению быстродействия машин: обработка больших чисел ведется последовательно-параллельным способом, сами числа представляются несколькими машинными словами, и для выполнения операций над ними необходимо составлять специальные программы. Поэтому если результат вычислений в естественной форме выходит за допустимые пределы, то в современных компьютерах производиться автоматический переход к представлению данных в экспотанциальной форме (но только если это оговорено программой).

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

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

· Для записи чисел, которые по своей природе имеют постоянную абсолютную погрешность: координаты в программах вёрстки, денежные суммы. Например, файлы метрики шрифтов TeX используют 32-битный знаковый тип с фиксированной запятой (12,20).

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

1. Определите максимальные значения целых чисел со знаком и без знака при их 8- и 32-разрядном представлении.