Содержание
Число с фиксированной запятой (англ. 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 предоставляли оба формата.
Стандарт 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. Числа с фиксированной точкой
Форма записи числа с фиксированной точкой использовалась в основном на ранних этапах развития вычислительной техники. Запись числа с фиксированной точкой обычно имеет знаковый и цифровой разряды. Фиксированная точка означает, что на этапе конструирования ЭВМ было определено, сколько и какие разряды машинного слова отведены под изображение целой и дробной частей числа. Запятая в разрядной сетке может быть зафиксирована, в принципе, после любого разряда.
Пример.
Ячейка с целой и дробной частью.
Как частный случай числа с фиксированной точкой может быть рассмотрена запись целого числа (в этом случае все разряды, кроме знакового, используются для записи целой части).
Пример.
Ячейка с записью целого числа.
К достоинствам использования чисел с фиксированной точкой относятся простота выполнения арифметических операций и высокая точность изображения чисел. К недостаткам — небольшой диапазон представления чисел.
При представлении в ЭВМ чисел в естественной форме устанавливается фиксированная длина разрядной сетки. При этом распределение разрядов между целой и дробной частями остается неизменным для любых чисел. В связи с эти в информатике существует другое название естественной формы представления чисел — с фиксированной точкой (запятой).
Работая на компьютере, мы можем вводить числа с фиксированной запятой в любом виде. Так же они будут высвечиваться на экране компьютера, но перед занесением в память компьютера они преобразуются в соответствии с разрядной сеткой и хранятся либо с запятой, фиксированной после последнего разряда (целые числа), либо с запятой перед старшим разрядом дроби.
Современные ЭВМ работают в режиме с плавающей точкой, но сохранен и режим работы с фиксированной точкой, который используется преимущемтвенно для представления целых чисел.
Обычно целые числа в ЭВМ занимают один, два или четыре байта. Один, как правило, старший бит отводится под знак числа. Знак положительного числа «+» кодируется нулем, а знак отрицательного числа «-» — единицей. Целые числа без знака в двух байтовом формате могут принимать значения от 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-разрядном представлении.