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

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

В вычислительных машинах применяются две формы представления двоичных чисел:

· естественная форма или форма с фиксированной запятой(точкой);

· нормальная форма или форма с плавающей запятой(точкой).

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

Например: в десятичной системе счисления имеется 5 разрядов в целой части чи­сла (до запятой) и 5 разрядов в дробной части числа (после запятой); числа, запи­санные в такую разрядную сетку, имеют вид:

+00721,35500; +00000,000328; -10301,20260.

Эта форма наиболее проста, естественна, но имеет небольшой диапазон пред­ставления чисел и поэтому чаще всего не приемлема при вычислениях. Диапа­зон значащих чисел n всистеме счисления с основанием Р при наличии т раз­рядов в целой части и s разрядов в дробной части числа (без учета знака числа) будет:

Например, при Р = 2, т = 10 и s = 6 числа изменяются в диапазоне:

где М – мантисса числа (|М| 3 ; +0,328·10 -3 ; -0,103012026·10 5 .

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

.

Пример. При Р = 2, m = 22 и s = 10 диапазон чисел простирается пример­но от 10 -300 до 10 300 . Для сравнения: количество секунд, которые прошли с момента образования планеты Земля, составляет всего 10 18 .

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

Выполнение операций над числами с плавающей запятой

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

При умножениичисел с плавающей запятой их мантиссы перемножаются, а по­рядки складываются.

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

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: При сдаче лабораторной работы, студент делает вид, что все знает; преподаватель делает вид, что верит ему. 9530 — | 7348 — или читать все.

91.146.8.87 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Число с фиксированной запятой (англ. 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 >>.
  • Для других операций, помимо обычных рядов Тейлора и итерационных методов, широко применяются вычисления по таблице.

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

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

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

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

Разработчики могут использовать числа одинарной и двоичной точности стандартных форматов IEEE 754, а как на счет чисел половинной точности (16 бит) или даже 8-битной с плавающей запятой? Последние используются в глубоких нейронных сетях (DNN), где используются малые значения. Также они могут применяться с весами нейронных сетей, в зависимости от оборудования и приложения.

Существует множество способов представления чисел. Однако макеты, как правило, меняются только по количеству задействованных битов. Использование знакового бита в двоично-кодированных значениях различается в зависимости от того, использует ли кодировка поразрядное дополнение до 1 или дополнительный код. Подход поразрядного дополнение к 1 использует ту же кодировку для целочисленной части, что означает, что на самом деле есть положительное и отрицательное нулевое значение. Дополнительный код имеет одно нулевое значение, но есть еще одно отрицательное значение, кроме положительного значения. Например, 8-разрядное целое число со знаком включает значения от -128 до -1, 0 и от 1 до 127.

Определение параметров

Типичные целочисленные форматы для микроконтроллеров и микропроцессоров включают 8-, 16-, 32-, 64- и 128-битные значения в зависимости от платформы. Многие языки программирования поддерживают разные целые числа, которые могут быть упакованы в структуры или массивы. Для периферийных интерфейсов могут также потребоваться разные значения размеров целочисленных значений. Расширение данных знаков до большего количества бит легко, поскольку все новые верхние биты равны нулю. Расширение дополнительного кода просто копирует знаковый бит в новые верхние биты. Обнаружение переполнения аналогично при уменьшении значения до меньшего числа бит.

Как отмечено, форматы с фиксированной запятой предлагают альтернативу значениям с плавающей запятой. Фиксированная запятая состоит из целочисленной и дробной частей. Количество бит, используемых для каждого, относится к определению и реализации. Фиксированная точка напрямую не поддерживается языками программирования, такими как C и C ++, хотя библиотеки для этой поддержки существуют. Программируемая логическая интегральная схема (FPGA) обычно поддерживают операции с фиксированной точкой в ​​дополнение к целым числам и числам с плавающей запятой. Поддержка плавающей запятой в FPGA часто использует в 100 раз больше шлюзов по сравнению с использованием фиксированной точки.

Читайте также:  Evolve stage 2 новости

Целая часть значения с фиксированной точкой обычно кодируется так же, как и подписанное или целочисленное. Часть фракции обычно кодируется для представлений дополнительным кодом или кодом с основанием 10. Работа программного и аппаратного обеспечения в этом случае будет несколько разниться. Некоторые языки программирования, такие как Ada, MATLAB и LabView National Instruments, имеют встроенную поддержку значений фиксированной точкой.

Числа с плавающей запятой имеют мантиссы и экспоненты. Большинство разработчиков работают со стандартными форматами с плавающей запятой IEEE 754, которые включают три бинарных и два десятичных формата. Бинарные версии — это 32-битная одноточечная, 64-битная двойная точность и 128-битная точность. Десятичные версии включают 64-битные и 128-битные версии. Показатель представляет собой значение дополнительный код для обоих форматов. Двоичные и десятичные версии варьируются в зависимости от значения мантиссы. Десятичный стандарт поддерживает плотно упакованный десятичный код (DPD), который более эффективен, чем двоично-десятичный (BCD), который использует 4 бита для каждой десятичной цифры. BCD тратит почти 40% возможностей кодирования по сравнению с DPD.

IEEE 754 также определяет положительные и отрицательные значения бесконечности, а также NaN или «not-a-number». Другое дело о стандарте заключается в том, что он определяет не только форматы кодирования. Он также указывает, как выполняются операции, включая крайние случаи.

Биты и длина

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

Задача использования чисел с плавающей запятой меньшего формата заключается в определении степени использования экспоненты. 8-битный «minifloat» имеет знаковый бит, четырехбитовый показатель и трехбитную мантиссу. Он поддерживает значения бесконечности и NaN. Наибольшее значение, которое может быть представлено, составляет 1,875 * 217 или 245760. Это «немного» больше, чем 128, поддерживаемое целочисленным знаком.

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

Кодировки переменной длины могут содержать различные цифровые форматы. Наиболее эффективным является двоичный код, но BCD и даже ASCII или EBCDIC также используются, поскольку строки легко поддерживаются на большинстве языков. Плотность кодирования еще ниже, чем BCD. Однако эффективность и производительность хранилища часто компенсируются другими проблемами программирования, такими как простота использования и межплатформенный обмен данными.

Рациональное представление

Рациональные числа могут быть закодированы как отношения целочисленных значений. Целочисленные значения числителя и знаменателя могут иметь фиксированный размер или переменную длину, в зависимости от предоставленной поддержки. Числа переменной длины и рациональные числа, как правило, реализуются библиотеками. Возможно реализовать поддержку аппаратного обеспечения с использованием ПЛИС (FPGA).

Преимущество рациональных чисел над числами с плавающей запятой — способность представлять рациональные числа, такие как 1/3 без ошибок округления. Это может быть полезно во многих приложениях; рациональные числа поддерживаются на нескольких языках программирования, таких как Common Lisp, Haskell, Perl 6 и Ruby. Поддержка на других языках часто доступна с использованием библиотек, таких как стандартный класс отношений (ratio) библиотеки в C ++.

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

Ссылка на основную публикацию
Adblock detector