Что такое вещественное число с фиксированной точкой
Арифметика fixed-point на C++
Сегодня расскажу Вам что такое fixed-point, зачем он нужен и как его можно использовать.
Существует такая проблема когда производительность приложения может заметно ухудшиться из-за особенностей вычисления на числах с плавающей точкой. Как правило CPU заточен под целочисленные операции, а сопроцессор FPU (floating point unit) в нем работает на порядке медленнее. Существую такие платформы где вообще отсутствует FPU и эмулирование операций с числами занимало бы много времени. Например, при наличии FPU, умножение чисел с плавающей точкой выполняется всего одной командой fmul, а при отсутствии FPU, умножение выполняется эмулирующей функцией __mulsf3. По сравнению с командой fmul, функция __mulsf3 эмулирует операции над числами с плавающей точкой, при этом вычисления производятся в целочисленном виде, что приводит к увеличению машинного кода и времени на его выполнение, в то время как команда fmul выполнит эту операцию быстро, с использованием аппаратных средств.
Данной проблеме существует решение, которое позволяет проводить вычисления с фиксированной точкой на целочисленном типе.
Принцип данного типа заключается в фиксированном сдвиге числа на N бит, в результате чего дробное число можно представить целым и оно будет иметь точность 2^N после точки. Пример преобразования числа с плавающей точкой в число с фиксированной точкой порядка 8 бит (2^8 = 1024).
Вот пример перевода числа с плавающей точкой в число с фиксированной точкой:
Данное число, после точки, имеет точность 2^8 после запятой.
Пример обратного перевода числа с фиксированной точкой в число с плавающей точкой.
В данном случае число после обратного перевода имеет вид 12345,6787109375 и является точным в 3 знака после точки, максимальная точность на самом деле равна 2^8 = 1024.
Как происходят вычисления на типе с фиксированной точкой?
Операции суммы и разности эквивалентны обычным целочисленным операциям.
Переполнение
При выполнении операций умножения и деления возможен случай переполнения, что приведет к неверному результату. Это произойдет в том случае, если, например, будет использоваться 32 битный целочисленный тип и при вычислениях произойдет переполнение данного типа и в результате этого переполнения число потеряет старшие биты. Существует два способа устранения переполнения:
Представление чисел с фиксированной и плавающей запятой
В вычислительных машинах применяются две формы представления двоичных чисел:
· естественная форма или форма с фиксированной запятой(точкой);
· нормальная форма или форма с плавающей запятой(точкой).
В форме представления с фиксированной запятойвсе числа изображаются в виде последовательности цифр с постоянным для всех чисел положением запятой, отделяющей целую часть от дробной.
Например: в десятичной системе счисления имеется 5 разрядов в целой части числа (до запятой) и 5 разрядов в дробной части числа (после запятой); числа, записанные в такую разрядную сетку, имеют вид:
Эта форма наиболее проста, естественна, но имеет небольшой диапазон представления чисел и поэтому чаще всего не приемлема при вычислениях. Диапазон значащих чисел n всистеме счисления с основанием Р при наличии т разрядов в целой части и s разрядов в дробной части числа (без учета знака числа) будет:
Например, при Р = 2, т = 10 и s = 6 числа изменяются в диапазоне:
В форме представления с плавающей запятойкаждое число изображается в виде двух групп цифр. Первая группа цифр называется мантиссой, вторая – порядком,причем абсолютная величина мантиссы должна быть меньше 1, а порядок – целым числом. В общем виде, число в форме с плавающей запятой может быть представлено так:
Нормальная форма представления имеет огромный диапазон отображения чисел и является основной в современных компьютерах. Так, диапазон значащих чисел в системе счисления с основанием Р при наличии т разрядов у мантиссы и s разрядов у порядка (без учета знаковых разрядов порядка и мантиссы) будет:
.
Следует заметить, что все числа с плавающей запятой хранятся в машине в так называемом нормализованном виде. Нормализованным называют такое число, в старшем разряде мантиссы которого стоит единица.
Выполнение операций над числами с плавающей запятой
При сложении (вычитании)чисел с одинаковыми порядками их мантиссы складываются (вычитаются), а результату присваивается порядок, общий для исходных чисел. Если порядки исходных чисел разные, то сначала эти порядки выравниваются (число с меньшим порядком приводится к числу с большим порядком), затем выполняется операция сложения (вычитания) порядков. Если при выполнении операции сложения мантисс возникает переполнение, то сумма мантисс сдвигается вправо на один разряд, а порядок суммы увеличивается на 1.
При умножениичисел с плавающей запятой их мантиссы перемножаются, а порядки складываются.
При делениичисла с плавающей запятой мантисса делимого делится на мантиссу делителя, а для получения порядка частного из порядка делимого вычитается порядок делителя. При этом если мантисса делимого больше мантиссы делителя, то мантисса частного окажется больше 1 (происходит переполнение) и ее следует сдвинуть на один разряд вправо, одновременно увеличив на единицу порядок частного.
Русские Блоги
Разговор о принципах компьютерной композиции (9) Числа с фиксированной точкой и работа с числами с фиксированной точкой
О чем эта статья?
В компьютере десятичная точка не представляется специальным устройством, а сохраняется в регистровом блоке согласованным способом. Арифметико-логический блок (ALU) является неотъемлемой частью ЦП, отвечающей за арифметические и логические операции. Итак, как работает ALU?
В этой статье в основном обсуждается следующее:
Что такое фиксированная точка?
В буквальном смысле «число с фиксированной точкой» означает, что «точка» не перемещается. Так какой же «смысл» не двигаться? Правильно, это «десятичная точка».
В прошлой лекции мы сказали, что десятичная точка есть, будь то целое или десятичное число.Десятичная точка целого числа указывается после последней цифры, а десятичная точка десятичного числа указывается после знака истинного значения.как показано на картинке:
В дополнение к числам с фиксированной запятой существует еще один вид чисел, называемый «числами с плавающей запятой». Числа с плавающей запятой будут представлены в следующей лекции.
Операции с фиксированной точкой
Что ж, после введения основных понятий чисел с фиксированной точкой мы начнем говорить об операциях смещения и четырех арифметических операциях с числами с фиксированной точкой. Четыре арифметики чисел с фиксированной точкой на самом деле намного сложнее, чем мы думали.
Машина не похожа на человека.Она знает, что два, два, четыре с первого взгляда. Ему нужно знать представление числа 2 с фиксированной точкой, а затем перемножить два числа с фиксированной точкой. Умножение имеет определенный процесс. После этого процесса можно получить двоичный результат. Номер, и напоследок выход к нам.Что нам нужно сделать, так это понять процесс сложения, вычитания, умножения и деления.。
Расчет смещения фиксированной точки
Не смотрите на простую операцию сдвига, но ее положение в расчетах компьютера очень важно. Без операции сдвига нет последующего умножения и деления.Умножение и деление реализуются при взаимодействии операций сдвига и операций сложения и вычитания.
Правила сменной работы:Хотя правила операции сдвига для положительных и отрицательных чисел различны, одно и то же состоит в том, что знаки положительных и отрицательных чисел остаются неизменными после сдвига. Тогда правило становитсяВо время операции сдвига знаковый бит не перемещается, а бит значения сдвигается в соответствии со следующими правилами.
например:
Сдвинуть исходный код, дополнительный и обратный код +26 влево на один бит
Результат: [26]оригинал = [26]анти- = [26]Составить = 0,0011010, по правилам результат сдвига исходного кода, одного дополнения и одного дополнения влево: 0,010100
Операция смены очень проста? Просто соблюдайте правила. Основное внимание уделяется следующим операциям.
Сложение и вычитание чисел с фиксированной точкой
Сложить и вычесть числа с фиксированной запятой нужно только помнить один принцип:Сложение добавляется напрямую, а вычитание становится сложением перед вычислением.
Что это значит? Например [A + B]Составить = [A+B]Составить,[A-B]Составить = [A]Составить + [-B]Составить。
Посмотрите на два примера:
Умножение с фиксированной точкой
Для формирования метода операции умножения рекомендую взглянуть на учебник по информатике, а именно «Принципы компьютерной композиции» Тан Шуофея. Эта статья написана с точки зрения практичности и не будет чрезмерно исследовать процесс вывода метода расчета, потому что мое объяснение не так хорошо, как в учебнике. Что касается реального расчета, то его нельзя назвать лучше учебника. По крайней мере, вы можете быстро приступить к расчету. Если вы сделаете это, то моя цель будет достигнута.
Метод расчета умножения с фиксированной точкой:
Двузначное умножение исходного кода: Двухзначное умножение исходного кода имеет арифметические правила, которые похожи на однобитовое умножение, но не то же самое.Двухзначное умножение исходного кода использует двузначную часть умножителя, чтобы определить, как формируется новая часть. Два двоичных числа имеют четыре формы: 00, 01, 10, 11, которые могут представлять различные методы сдвига и методы сложения (см. Ниже). В сочетании с битом флага C можно выполнять более сложные операции. как показано на картинке:
С помощью приведенных выше правил мы можем легко произвести двузначное умножение исходного кода на основе однозначного умножения исходного кода.Процесс вычисления: инициализируйте частичный продукт равным 0, запишите множитель, и положение флага равно 0. Определите соотношение между двумя последними цифрами множителя и битом флага, вызовите соответствующий метод для сдвига и установки бита флага, и окончательный результат будет справа Переместите два бита и определите знак согласно исключающему ИЛИ знаков x и y. Необходимо отметить, что для двузначного умножения необходимо зарезервировать три знаковых бита.Приведите пример:
Умножение с дополнительным кодом: Однобитовое умножение с одним дополнением похоже на исходное однобитовое умножение, разница в том, что,Когда множитель положительный, метод операции умножения с одним дополнением такой же, как и при исходном однобитовом умножении; когда множитель отрицательный, первая половина однобитового умножения с одним дополнением также совпадает с однобитовым умножением исходного кода. После завершения операции нужно добавить к окончательному результату [-x]СоставитьЕго можно использовать для проверки, чтобы получить окончательный результат. Происхождение этой части также можно найти в учебниках.Ниже приведен пример:
Сравнение дополнительного кода: я считаю, что с предыдущим основанием вы можете решить проблему, указав правила напрямую.Работа правил сравнения дополнительного кода следующие:
Приведите пример: [x]Составить = 0.1101,[y]Составить = 0,1011. Процесс расчета выглядит следующим образом:
Двузначное умножение с двумя дополнительными цифрами: нет большой разницы между двузначным умножением с двумя дополнительными числами и описанным выше методом. Главное, что при двузначном умножении используются три знаковых бита и три оценочных бита (бит множителя). С правилами работы сделайте Тема слишком проста.
Пример: [x]Составить=0.0101,[y]Составить= 1.0101, найти [x * y]Составить。
Деление с фиксированной точкой
В этой статье много содержания. Чтобы облегчить читателям усвоение знаний, объяснение деления будет выпущено в следующей статье, так что следите за обновлениями.
Заключение
Если вам понравилась моя статья, подпишитесь на мой публичный аккаунт WeChat «Битовый поток с наивысшими привилегиями«В настоящее время!
[Ссылки] «Принципы компьютерной организации», Тан Шуофэй.
Числа в форме с фиксированной точкой
Типы и форматы операндов
Машинные команды оперируют данными, которые принято называть операндами. К наиболее общим (базовым) типам операндов можно отнести:
Для каждого типа данных в компьютере предусмотрены определенные форматы.
Числовая информация
Среди цифровых данных можно выделить две группы:
— целые типы, используемые для представления целых чисел;
— вещественные типы для представления рациональных чисел.
В рамках первой группы имеется несколько форматов представления численной информации, зависящих от ее характера. Для представления вещественных чисел используется формат с плавающей точкой.
Числа в форме с фиксированной точкой
Представление числа X в форме с фиксированной точкой (ФТ), которую иногда называют также естественной формой, включает в себя знак числа и его модуль в q-ичном коде. Здесь q — основание системы счисления или база. Для современных компьютеров характерна двоичная система (q=2), но существовали также восьмеричная (q=8) или шестнадцатеричная (q=16) системы счисления. Знак положительного числа кодируется двоичной цифрой 0, а знак отрицательного числа — цифрой 1.
Числам с фиксированной точкой соответствует запись вида X = ±an-1…a0a-1a-2…a—r. Отрицательные числа обычно представляются в дополнительном коде. Разряд кода числа, в котором размещается знак, называется знаковым разрядом кода. Разряды, где располагаются значащие цифры числа, называются цифровыми разрядами кода. Знаковый разряд размещается левее старшего цифрового разряда. Положение точки одинаково для всех чисел и в процессе решения задачи не меняется. Хотя точка и фиксируется, в коде числа она никак не выделяется, а только подразумевается.
В общем случае разрядная сетка для размещения чисел в форме с фиксированной точкой имеет вид, представленный на рис. 14.1, где k разрядов используются для записи целой части числа и r разрядов — для дробной части.
Рис. 14.1. Формат представления чисел с фиксированной точкой
Если число является смешанным (содержит целую и дробную части), оно обрабатываются как целое, хотя и не является таковым (в этом случае применяют термин масштабируемое целое). Обработка смешанных чисел в компьютерах встречается крайне редко. Как правило, используются компьютеры с дробной (n = 0) либо целочисленной (r=0) арифметикой.
При фиксации точки перед старшим цифровым разрядом (рис. 14.2) могут быть представлены только правильные дроби. Для ненулевых чисел возможны два варианта представления (нулевому значению соответствуют нули во всех разрядах): знаковое и беззнаковое. Фиксация точки перед старшим разрядом в настоящее время практически не встречается.
При фиксации точки после младшего разряда представимы лишь целые числа. Это наиболее распространенный способ, поэтому в дальнейшем понятие чисел в формате с фиксированной точкой будет связываться исключительно с целыми числами, а операции с числами в формате с фиксированной точкой будут характеризоваться как целочисленные. Форматы целых чисел со знаком и без знака представлены на рис. 14.2 и 14.3.
Рис. 14.2. Представление целых чисел без знака в формате с фиксированной точкой
Рис. 14.3. Представление целых чисел со знаком в формате с фиксированной точкой
Целые числа применяются также для работы с адресами. Адреса обрабатываются как целые числа без знака.
Представление чисел в формате с фиксированной точкой упрощает аппаратную реализацию процессора и сокращает время выполнения машинных операций, однако при решении задач необходимо постоянно следить за тем, чтобы все исходные данные, промежуточные и окончательные результаты не выходили за допустимый диапазон формата, иначе возможно переполнение разрядной сетки и результат вычислений будет неверным.
Дата добавления: 2015-09-28 ; просмотров: 464 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Когда десятичные числа с фиксированной запятой отображаются для чтения человеком, цифры дроби обычно отделяются от цифр целой части символом системы счисления (обычно ‘.’ На английском языке, но ‘,’ или каким-либо другим символом на многих других языках). Однако внутри нет разделения, и различие между двумя группами цифр определяется только программами, которые обрабатывают такие числа.
СОДЕРЖАНИЕ
Представление
Представленная ценность | Внутреннее представительство |
---|---|
0,00 | 0 |
0,5 | 50 |
0,99 | 99 |
2 | 200 |
−14,1 | −1410 |
314,160 | 31416 |
Выбор масштабных коэффициентов
Однако иногда могут использоваться другие коэффициенты масштабирования, например дробное количество часов может быть представлено как целое число секунд; то есть как число с фиксированной точкой с масштабным коэффициентом 1/3600.
Даже при самом тщательном округлении значения с фиксированной точкой, представленные с коэффициентом масштабирования S, могут иметь ошибку до ± 0,5 в сохраненном целом числе, то есть ± 0,5 S в значении. Следовательно, меньшие коэффициенты масштабирования обычно дают более точные результаты.
ж | S | δ | V мин | V макс. |
---|---|---|---|---|
−3 | 1/2 −3 = 8 | 4 | — 262 144 | + 262 143 |
0 | 1/2 0 = 1 | 0,5 | — 32 768 | + 32 767 |
5 | 1/2 5 = 1/32 | 000 00 | +1023. 968 75 | |
14 | 1/2 14 = 1/16 384 | 000 031 | −2. 000 000 000 000 00 | +1. 999 938 964 843 75 |
15 | 1/2 15 = 1/32 768 | 000 016 | −1. 000 000 000 000 000 | +0. 999 969 482 421 875 |
16 | 1/2 16 = 1/65 536 | 000 008 | −0. 500 000 000 000 000 0 | +0. 499 984 741 210 937 5 |
20 | 1/2 20 = 1/1 048 576 | 000 000 5 | −0. 031 250 000 000 000 000 00 | +0. 031 249 046 325 683 593 75 |
Точные значения
Сравнение с плавающей точкой
Программы, использующие вычисления с фиксированной точкой, обычно более переносимы, чем программы, использующие плавающую точку, поскольку они не зависят от доступности FPU. Это преимущество было особенно сильным до того, как стандарт IEEE с плавающей запятой получил широкое распространение, когда вычисления с плавающей запятой с одними и теми же данными давали разные результаты в зависимости от производителя и часто от модели компьютера.
Во многих случаях ошибки округления и усечения вычислений с фиксированной запятой легче анализировать, чем ошибки эквивалентных вычислений с плавающей запятой. С другой стороны, использование фиксированной точки требует от программиста большей осторожности. Для предотвращения переполнения требуются более точные оценки диапазонов переменных и всех промежуточных значений в вычислениях, а также часто дополнительный код для настройки их коэффициентов масштабирования.
Приложения
Операции
Сложение и вычитание
Умножение
Чтобы умножить два числа с фиксированной точкой, достаточно умножить два базовых целых числа и предположить, что коэффициент масштабирования результата является произведением их коэффициентов масштабирования. Результат будет точным, без округления, при условии, что он не переполняет принимающую переменную.
Разделение
Чтобы разделить два числа с фиксированной запятой, берется целое частное их базовых целых чисел и предполагается, что коэффициент масштабирования является частным их коэффициентов масштабирования. Как правило, первое деление требует округления, поэтому результат не точный.
Например, деление 3456, масштабированного на 1/100 (34,56), и 1234, масштабированного на 1/1000 (1,234), дает целое число 3456 ÷ 1234 = 3 (округлено) с коэффициентом масштабирования (1/100) / (1/1000) = 10, то есть 30. В качестве другого примера, деление первого числа на 155, неявно масштабированное на 1/32 (155/32 = 4,84375), дает целое число 3456 ÷ 155 = 22 (округлено) с неявным коэффициентом масштабирования (1 / 100) / (1/32) = 32/100 = 8/25, то есть 22 × 32/100 = 7,04.
Если результат не точен, ошибку, вносимую округлением, можно уменьшить или даже устранить путем преобразования делимого в меньший коэффициент масштабирования. Например, если r = 1,23 представлено как 123 с масштабированием 1/100, а s = 6,25 представлено как 6250 с масштабированием 1/1000, то простое деление целых чисел дает 123 ÷ 6250 = 0 (округлено) с коэффициентом масштабирования ( 1/100) / (1/1000) = 10. Если r сначала преобразовать в 1,230,000 с коэффициентом масштабирования 1/1000000, результат будет 1,230,000 ÷ 6250 = 197 (округлено) с коэффициентом масштабирования 1/1000 (0,197). Точное значение 1,23 / 6,25 составляет 0,1968.
Масштабирование преобразования
При вычислениях с фиксированной точкой часто необходимо преобразовать значение в другой коэффициент масштабирования. Эта операция необходима, например:
Например, если общий коэффициент масштабирования равен 1/100, умножение 1,23 на 0,25 влечет за собой умножение 123 на 25, чтобы получить 3075 с промежуточным коэффициентом масштабирования 1/10000. Чтобы вернуться к исходному коэффициенту масштабирования 1/100, целое число 3075 затем нужно умножить на 1/100, то есть разделить на 100, чтобы получить либо 31 (0,31), либо 30 (0,30), в зависимости от политики округления. использовал.
Преобразование в числа с плавающей точкой и обратно
Аппаратная поддержка
Масштабирование и перенормировка
Ранние компьютеры, такие как IBM 1620 и Burroughs B3500, использовали двоично-десятичное представление (BCD) для целых чисел, а именно основание 10, где каждая десятичная цифра независимо кодировалась 4 битами. Некоторые процессоры, например микроконтроллеры, все еще могут его использовать. В таких машинах преобразование десятичных коэффициентов масштабирования может выполняться битовыми сдвигами и / или манипулированием адресами памяти.
Переполнение
Переполнение происходит, когда результат арифметической операции слишком велик для сохранения в назначенной области назначения. Помимо сложения и вычитания для результата может потребоваться на один бит больше, чем для операндов. При умножении двух целых чисел без знака на m и n бит результат может иметь m + n бит.
Некоторые процессоры могут устанавливать флаг аппаратного переполнения и / или генерировать исключение при возникновении переполнения. Некоторые процессоры вместо этого могут обеспечивать арифметику насыщения : если результат сложения или вычитания был переполнен, они вместо этого сохраняют значение с наибольшей величиной, которая может поместиться в области приема и имеет правильный знак.
Однако на практике эти функции не очень полезны; Как правило, проще и безопаснее выбирать коэффициенты масштабирования и размеры слов, чтобы исключить возможность переполнения, или проверять операнды на наличие чрезмерных значений перед выполнением операции.
Компьютерная языковая поддержка
С другой стороны, все реляционные базы данных и нотация SQL поддерживают десятичную арифметику с фиксированной точкой и хранение чисел. PostgreSQL имеет специальный числовой тип для точного хранения чисел до 1000 цифр.
Более того, в 2008 году Международная организация по стандартизации (ISO) выпустила предложение о расширении языка программирования C с помощью типов данных с фиксированной точкой в интересах программ, работающих на встроенных процессорах. Кроме того, коллекция компиляторов GNU (GCC) имеет внутреннюю поддержку фиксированной точки.
Подробные примеры
Десятичное умножение с фиксированной запятой
Предположим, есть следующее умножение с двумя числами с фиксированной запятой и тремя десятичными знаками.
(10,500) (1,050) = 1 * 10,500 + 0,050 * 10,500 = 10,500 + 0,525000 = 11,025000
Таким образом, наше умножение становится
Это округляется до 11,023 с тремя цифрами после десятичной точки.
Двоичное умножение с фиксированной точкой
Для более сложного примера предположим, что два числа 1.2 и 5.6 представлены в 32-битном формате с фиксированной точкой с 30 и 20 дробными битами соответственно. Масштабирование на 2 30 и 2 20 дает 1 288 490 188,8 и 5 872 025,6, округляя до 1 288 490 189 и 5 872 026 соответственно. Оба числа по-прежнему помещаются в 32-битную целочисленную переменную со знаком и представляют собой дроби.
1. 200 000 000 186 264 514 923 095 703 125 и 5. 600 000 381 469 726 562 50
6. 720 000 458 806 753 229 623 609 513 510
Обозначения
Для краткого определения параметров формата с фиксированной точкой использовались различные обозначения. В следующем списке f представляет количество дробных битов, m количество величин или целочисленных битов, s количество знаковых битов и b общее количество битов.