stringtranslate.com

Арифметика с фиксированной точкой

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

В представлении с фиксированной точкой дробь часто выражается в той же системе счисления , что и целая часть, но с использованием отрицательных степеней основания b . Наиболее распространенными вариантами являются десятичная (основание 10) и двоичная (основание 2). Последняя обычно известна также как двоичное масштабирование . Таким образом, если сохранено n цифр дроби, значение всегда будет целым числом, кратным b n . Представление с фиксированной точкой также может использоваться для пропуска младших цифр целых значений, например, при представлении больших долларовых значений как кратных 1000 долларов.

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

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

Представление

Представление дробного числа с фиксированной точкой по сути является целым числом , которое должно быть неявно умножено на фиксированный масштабный коэффициент. Например, значение 1,23 может быть сохранено в переменной как целочисленное значение 1230 с неявным масштабным коэффициентом 1/1000 (это означает, что последние 3 десятичные цифры неявно считаются десятичной дробью), а значение 1 230 000 может быть представлено как 1230 с неявным масштабным коэффициентом 1000 (с подразумеваемыми цифрами десятичной дроби "минус 3", то есть с 3 неявными нулевыми цифрами справа). Это представление позволяет стандартным целочисленным арифметическим логическим устройствам выполнять вычисления рациональных чисел .

Отрицательные значения обычно представляются в двоичном формате с фиксированной точкой как целое число со знаком в дополнительном коде с неявным масштабным коэффициентом, как указано выше. Знак значения всегда будет указываться первым сохраненным битом (1 = отрицательное, 0 = неотрицательное), даже если количество бит дроби больше или равно общему количеству бит. Например, 8-битное двоичное целое число со знаком (11110101) 2 = −11, взятое с -3, +5 и +12 подразумеваемыми битами дроби, будет представлять значения −11/2 −3 = −88, −11/2 5 = −0. 343 75 и −11/2 12 = −0. 002 685 546 875 соответственно.

В качестве альтернативы отрицательные значения могут быть представлены целым числом в формате знак-величина , в этом случае знак никогда не включается в число подразумеваемых бит дроби. Этот вариант чаще используется в десятичной арифметике с фиксированной точкой. Таким образом, знаковое 5-значное десятичное целое число (−00025) 10 , взятое с -3, +5 и +12 подразумеваемыми цифрами десятичной дроби, будет представлять значения −25/10 −3 = −25000, −25/10 5 = −0,00025 и −25/10 12 = −0, 000 000 000 025 соответственно.

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

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

Выбор коэффициентов масштабирования

Для большей эффективности масштабные коэффициенты часто выбираются как степени (положительные или отрицательные) основания b , используемого для внутреннего представления целых чисел. Однако часто наилучший масштабный коэффициент диктуется приложением. Таким образом, часто используются масштабные коэффициенты, которые являются степенями 10 (например, 1/100 для долларовых значений), для удобства человека, даже когда целые числа представлены внутренне в двоичной системе. Десятичные масштабные коэффициенты также хорошо сочетаются с метрической (СИ) системой , поскольку выбор масштабного коэффициента с фиксированной точкой часто эквивалентен выбору единицы измерения (например, сантиметров или микрон вместо метров ).

Однако иногда могут использоваться и другие коэффициенты масштабирования, например, дробное количество часов может быть представлено как целое число секунд, то есть как число с фиксированной точкой с коэффициентом масштабирования 1/3600.

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

С другой стороны, меньший коэффициент масштабирования означает меньший диапазон значений, которые могут быть сохранены в данной программной переменной. Максимальное значение с фиксированной точкой, которое может быть сохранено в переменной, — это наибольшее целочисленное значение, которое может быть сохранено в ней, умноженное на коэффициент масштабирования; и аналогично для минимального значения. Например, в таблице ниже приведены подразумеваемый коэффициент масштабирования S , минимальное и максимальное представимые значения V min и V max и точность δ = S /2 значений, которые могут быть представлены в 16-битном двоичном формате с фиксированной точкой со знаком, в зависимости от числа f подразумеваемых дробных битов.

Форматы с фиксированной точкой с коэффициентами масштабирования вида 2 n -1 (а именно 1, 3, 7, 15, 31 и т. д.) считаются подходящими для обработки изображений и других задач цифровой обработки сигналов. Предполагается, что они обеспечивают более последовательные преобразования между значениями с фиксированной и плавающей точкой, чем обычное масштабирование 2 n . Язык программирования Julia реализует обе версии. [2]

Точные значения

Любая двоичная дробь a /2 m , например 1/16 или 17/32, может быть точно представлена ​​в виде числа с фиксированной точкой с коэффициентом масштабирования степени двойки 1/2 n при любом nm . Однако большинство десятичных дробей, например 0,1 или 0,123, являются бесконечными повторяющимися дробями в системе счисления с основанием 2 и, следовательно, не могут быть представлены таким образом.

Аналогично, любая десятичная дробь a /10 m , например, 1/100 или 37/1000, может быть точно представлена ​​в фиксированной точке с коэффициентом масштабирования степени десяти 1/10 n с любым nm . Этот десятичный формат также может представлять любую двоичную дробь a /2 m , например, 1/8 (0,125) или 17/32 (0,53125).

В более общем случае рациональное число a / b , где a и b взаимно простые , а b положительное, может быть точно представлено в двоичной системе с фиксированной точкой, только если b является степенью числа 2; и в десятичной системе с фиксированной точкой, только если b не имеет простых множителей, отличных от 2 и/или 5.

Сравнение с плавающей точкой

Вычисления с фиксированной точкой могут быть быстрее и/или использовать меньше оборудования, чем вычисления с плавающей точкой. Если диапазон представляемых значений известен заранее и достаточно ограничен, фиксированная точка может лучше использовать доступные биты. Например, если для представления числа от 0 до 1 доступно 32 бита, представление с фиксированной точкой может иметь ошибку менее 1,2 × 10 −10 , тогда как стандартное представление с плавающей точкой может иметь ошибку до 596 × 10 −10 — потому что 9 бит тратятся впустую со знаком и показателем динамического масштабирующего коэффициента. В частности, сравнивая 32-битный звук с фиксированной точкой и с плавающей точкой , запись, требующая менее 40 дБ запаса по уровню, имеет более высокое отношение сигнал/шум при использовании 32-битного фиксированного.

Программы, использующие вычисления с фиксированной точкой, обычно более переносимы, чем те, которые используют плавающую точку, поскольку они не зависят от доступности FPU. Это преимущество было особенно сильным до того, как был широко принят стандарт IEEE Floating Point , когда вычисления с плавающей точкой с теми же данными давали разные результаты в зависимости от производителя и часто от модели компьютера.

Во многих встроенных процессорах отсутствует FPU, поскольку целочисленные арифметические блоки требуют значительно меньше логических вентилей и занимают гораздо меньшую площадь чипа , чем FPU; а программная эмуляция чисел с плавающей точкой на низкоскоростных устройствах была бы слишком медленной для большинства приложений. Чипы ЦП для ранних персональных компьютеров и игровых консолей , таких как Intel 386 и 486SX , также не имели FPU.

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

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

Приложения

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

Двоичное с фиксированной точкой (двоичное масштабирование) широко использовалось с конца 1960-х до 1980-х годов для вычислений в реальном времени, которые были математически интенсивными, такими как моделирование полета и в алгоритмах управления атомными электростанциями . Оно до сих пор используется во многих приложениях DSP и заказных микропроцессорах. Вычисления, включающие углы, использовали бы двоичное угловое измерение .

Двоичная фиксированная точка используется в сопроцессорах CORDIC серии STM32G4 и в алгоритмах дискретного косинусного преобразования, используемых для сжатия изображений JPEG .

Электронные приборы, такие как счетчики электроэнергии и цифровые часы, часто используют полиномы для компенсации внесенных ошибок, например, от температуры или напряжения питания. Коэффициенты производятся с помощью полиномиальной регрессии . Двоичные полиномы с фиксированной точкой могут использовать больше бит точности, чем с плавающей точкой, и делают это в быстром коде с использованием недорогих процессоров. Точность, имеющая решающее значение для приборов, хорошо сопоставима с вычислениями с плавающей точкой эквивалентного бита, если полиномы с фиксированной точкой оцениваются с использованием метода Хорнера (например, y = (( ax + b ) x + c ) x + d ) для уменьшения количества раз, когда происходит округление, а умножения с фиксированной точкой используют округляющие слагаемые.

Операции

Сложение и вычитание

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

Умножение

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

Например, умножение чисел 123, масштабированных на 1/1000 (0,123), и 25, масштабированных на 1/10 (2,5), дает целое число 123×25 = 3075, масштабированное на (1/1000)×(1/10) = 1/10000, то есть 3075/10000 = 0,3075. В качестве другого примера, умножение первого числа на 155, неявно масштабированное на 1/32 (155/32 = 4,84375), дает целое число 123×155 = 19065 с неявным коэффициентом масштабирования (1/1000)×(1/32) = 1/32000, то есть 19065/32000 = 0,59578125.

В двоичной системе обычно используют масштабный коэффициент, который является степенью двойки. После умножения масштабный коэффициент можно разделить сдвигом вправо. Сдвиг выполняется просто и быстро на большинстве компьютеров. Округление возможно путем добавления «округляющего слагаемого» в размере половины масштабного коэффициента перед сдвигом; Доказательство: round(x/y) = floor(x/y + 0.5) = floor((x + y/2)/y) = shift-of-n(x + 2^(n-1)) Похожий метод можно использовать при любом масштабировании.

Разделение

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

Например, деление 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.

Масштабирование преобразования

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

Чтобы преобразовать число из типа с фиксированной точкой с масштабным коэффициентом R в другой тип с масштабным коэффициентом S , базовое целое число должно быть умножено на отношение R / S. Таким образом, например, чтобы преобразовать значение 1,23 = 123/100 из масштабного коэффициента R = 1/100 в число с масштабным коэффициентом S = 1/1000, целое число 123 должно быть умножено на (1/100)/(1/1000) = 10, что даст представление 1230/1000.

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

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

В частности, если r и s являются переменными с фиксированной точкой с неявными масштабными коэффициентами R и S , операция rr × s требует умножения соответствующих целых чисел и явного деления результата на S. Результат может потребоваться округлить, и может произойти переполнение.

Например, если общий коэффициент масштабирования равен 1/100, то умножение 1,23 на 0,25 влечет за собой умножение 123 на 25, что дает 3075 с промежуточным коэффициентом масштабирования 1/10000. Чтобы вернуться к исходному коэффициенту масштабирования 1/100, целое число 3075 необходимо умножить на 1/100, то есть разделить на 100, что даст либо 31 (0,31), либо 30 (0,30) в зависимости от используемой политики округления .

Аналогично, операция rr / s потребует деления целых чисел и явного умножения частного на S. Здесь также может возникнуть округление и/или переполнение.

Преобразование в числа с плавающей точкой и обратно

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

Чтобы преобразовать число с фиксированной точкой в ​​число с плавающей точкой, можно преобразовать целое число в число с плавающей точкой, а затем разделить его на масштабный коэффициент S. Это преобразование может повлечь за собой округление, если абсолютное значение целого числа больше 2 24 (для двоичного числа с плавающей точкой одинарной точности IEEE) или 2 53 (для двойной точности). Переполнение или потеря значимости могут возникнуть, если | S | очень велико или очень мало соответственно.

Поддержка оборудования

Масштабирование и перенормировка

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

Ранние компьютеры, такие как IBM 1620 и Burroughs B3500, использовали двоично-десятичное (BCD) представление для целых чисел, а именно основание 10, где каждая десятичная цифра была независимо закодирована 4 битами. Некоторые процессоры, такие как микроконтроллеры, все еще могут использовать его. В таких машинах преобразование десятичных масштабных коэффициентов может выполняться путем битовых сдвигов и/или манипуляции адресами памяти.

Некоторые архитектуры DSP предлагают встроенную поддержку для определенных форматов с фиксированной точкой, например, знаковых n -битных чисел с n −1 битами дроби (чьи значения могут находиться в диапазоне от −1 до почти +1). Поддержка может включать инструкцию умножения, которая включает перенормировку — масштабное преобразование произведения из 2 n −2 в n −1 битов дроби. [ необходима цитата ] Если ЦП не предоставляет эту функцию, программист должен сохранить произведение в достаточно большом регистре или временной переменной и явно закодировать перенормировку.

Переполнение

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

В случае переполнения старшие биты обычно теряются, так как немасштабированное целое число сокращается по модулю 2 n, где n — размер области хранения. В частности, теряется бит знака, что может радикально изменить знак и величину значения.

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

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

Поддержка компьютерного языка

Явная поддержка чисел с фиксированной точкой предоставляется несколькими компьютерными языками, в частности PL/I , COBOL , Ada , JOVIAL и Coral 66 . Они предоставляют типы данных с фиксированной точкой с двоичным или десятичным масштабным коэффициентом. Компилятор автоматически генерирует код для выполнения соответствующих масштабных преобразований при выполнении операций с этими типами данных, при чтении или записи переменных или при преобразовании значений в другие типы данных, такие как с плавающей точкой.

Большинство этих языков были разработаны между 1955 и 1990 годами. Более современные языки обычно не предлагают никаких типов данных с фиксированной точкой или поддержки преобразования масштабного коэффициента. Это также касается нескольких старых языков, которые все еще очень популярны, таких как FORTRAN , C и C++ . Широкая доступность быстрых процессоров с плавающей точкой со строго стандартизированным поведением значительно снизила потребность в поддержке двоичной фиксированной точки. [ необходима цитата ] Аналогичным образом поддержка десятичных чисел с плавающей точкой в ​​некоторых языках программирования, таких как C# и Python , устранила большую часть необходимости в поддержке десятичных чисел с фиксированной точкой. В немногих ситуациях, требующих операций с фиксированной точкой, они могут быть реализованы программистом с явным преобразованием масштабирования на любом языке программирования.

С другой стороны, все реляционные базы данных и нотация SQL поддерживают десятичную арифметику с фиксированной точкой и хранение чисел. PostgreSQL имеет специальныйчисловойтип для точного хранения чисел длиной до 1000 цифр. [3]

Более того, в 2008 году Международная организация по стандартизации (ISO) выпустила предложение о расширении языка программирования C типами данных с фиксированной точкой для программ, работающих на встроенных процессорах. [4] Кроме того, коллекция компиляторов GNU (GCC) имеет внутреннюю поддержку для фиксированной точки. [5] [6]

Подробные примеры

Умножение десятичных чисел с фиксированной точкой

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

Обратите внимание, что поскольку есть 3 десятичных знака, мы показываем конечные нули. Чтобы переохарактеризовать это как целочисленное умножение, мы должны сначала умножить, переместив все десятичные знаки в целые, затем мы умножим на , чтобы вернуть их обратно, теперь уравнение выглядит как

Это работает эквивалентно, если мы выберем другую базу, в частности, базу 2 для вычислений, поскольку сдвиг бита — это то же самое, что умножение или деление на порядок 2. Три десятичных цифры эквивалентны примерно 10 двоичным цифрам, поэтому мы должны округлить 0,05 до 10 бит после двоичной точки. Тогда ближайшее приближение — 0,0000110011.

Таким образом, наше умножение становится

Округляется до 11,023 с тремя цифрами после запятой.

Двоичное умножение с фиксированной точкой

Рассмотрим задачу вычисления произведения 1,2 и 5,6 с двоичной фиксированной точкой, используя 16 бит дроби. Чтобы представить два числа, их умножают на 2 16 , получая 78 643 .2 и 367 001 .6; и округляют эти значения до ближайших целых чисел, получая 78 643 и 367 002 . Эти числа легко поместятся в 32-битное слово с дополнительным кодом со знаком.

Умножение этих целых чисел дает 35-битное целое число 28 862 138 286 с 32 битами дробной части без округления. Обратите внимание, что сохранение этого значения непосредственно в 32-битной целочисленной переменной приведет к переполнению и потере наиболее значимых битов. На практике оно, вероятно, будет сохранено в знаковой 64-битной целочисленной переменной или регистре .

Если результат должен храниться в том же формате, что и данные, с 16 битами дробной части, это целое число следует разделить на 2 16 , что дает приблизительно 440 401 .28, а затем округлить до ближайшего целого числа. Этот эффект может быть достигнут путем прибавления 2 15 и последующего сдвига результата на 16 бит. Результат равен 440 401 , что представляет собой значение 6. 719 985 961 914 062 5 . Принимая во внимание точность формата, это значение лучше выразить как 6. 719 986 ± 0. 000 008 (не считая ошибки, которая возникает из-за приближений операндов). Правильный результат будет 1.2 × 5.6 = 6.72.

Для более сложного примера предположим, что два числа 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

Их произведение (в точности) равно 53-битному целому числу 7 566 047 890 552 914 , которое имеет 30+20 = 50 подразумеваемых бит дроби и, следовательно, представляет дробь

6. 720 000 458 806 753 229 623 609 513 510

Если мы решим представить это значение в фиксированном формате 16-бит со знаком с 8 битами дроби, мы должны разделить целочисленное произведение на 2 50-8 = 2 42 и округлить результат; чего можно добиться, прибавив 2 41 и выполнив сдвиг на 42 бита. Результат равен 1720, что представляет собой значение 1720/2 8 = 6,718 75 или приблизительно 6,719 ± 0,002.

Обозначения

Для краткого указания параметров формата с фиксированной точкой использовались различные обозначения. В следующем списке f представляет число дробных битов, m — число битов величины или целого числа, s — число знаковых битов, а b — общее число битов.

Примеры применения программного обеспечения

Смотрите также

Ссылки

  1. ^ «В чем разница между форматами с фиксированной точкой, с плавающей точкой и числовыми форматами?». ElectronicDesign . 2017-08-31.
  2. ^ Документация по языку программирования Julia. Пакет FixedPointNumbers.
  3. ^ Руководство PostgreSQL, раздел 8.1.2. Числа произвольной точности
  4. ^ JTC1/SC22/WG14 (2008), статус TR 18037: Встроенный C
  5. ^ GCC wiki, Поддержка арифметики с фиксированной точкой
  6. ^ Использование GCC, раздел 5.13 Типы с фиксированной точкой
  7. ^ IBM Corporation, "Числовые элементы". Сайт онлайн-документации, дата обращения 2021-07-05.
  8. ^ Документация Ada 83: "Rationale, 5.3.2: Fixed Point Types". Дата обращения 05.07.2021.
  9. ^ ab "Приложение A.2". Справочник программиста библиотеки DSP TMS320C64x (PDF) . Даллас, Техас, США: Texas Instruments Incorporated . Октябрь 2003 г. SPRU565. Архивировано (PDF) из оригинала 2022-12-22 . Получено 2022-12-22 .
  10. ^ "MathWorks Fixed-Point Toolbox Documentation Glossary". mathworks.com . Архивировано из оригинала 2011-03-16 . Получено 2011-01-28 .
  11. ^ "ARM Developer Suite AXD и armsd Debuggers Guide". 1.2. ARM Limited . 2001 [1999]. Глава 4.7.9. AXD > Средства AXD > Форматирование данных > Q-формат. ARM DUI 0066D. Архивировано из оригинала 2017-11-04.
  12. ^ "Глава 4.7.9. AXD > Средства AXD > Форматирование данных > Q-формат". RealView Development Suite AXD и руководство по отладке armsd (PDF) . 3.0. ARM Limited . 2006 [1999]. стр. 4–24. ARM DUI 0066G. Архивировано (PDF) из оригинала 2017-11-04.
  13. ^ "VisSim теперь — solidThinking Embed". www.vissim.com . solidThinking Inc.
  14. ^ Руководство пользователя PS2 GS, Глава 7.1 «Пояснительные примечания»
  15. ^ «Набор инструкций TrueType: типы данных».
  16. ^ "[Freetype] Почему 26,6?".
  17. ^ "Dolphin Emulator". Dolphin Emulator . 2014-03-15.
  18. ^ "Техническое описание WavPack". www.wavpack.com . Получено 2015-07-13 .
  19. ^ Библиотека утилит Nest Labs
  20. ^ "Fractint, A Little Code". Архивировано из оригинала 2010-10-27 . Получено 2005-10-24 .
  21. ^ "Введение в библиотеку квантовой математики" . Получено 13 ноября 2019 г.

Дальнейшее чтение

Внешние ссылки