Масштабный коэффициент (информатика)
Эта статья нуждается в дополнительных цитатах для проверки . ( июль 2007 г. ) |
В информатике масштабный коэффициент — это число, используемое в качестве множителя для представления числа в другом масштабе , действующее аналогично показателю степени в математике . Масштабный коэффициент используется, когда реальный набор чисел необходимо представить в другом масштабе, чтобы он соответствовал определенному числовому формату . Хотя использование масштабного коэффициента расширяет диапазон представимых значений, оно также снижает точность , что приводит к ошибке округления для некоторых вычислений.
Использование
[ редактировать ]Определенные числовые форматы могут быть выбраны для приложения для удобства программирования или из-за определенных преимуществ, предлагаемых аппаратным обеспечением для этого числового формата. Например, ранние процессоры изначально не поддерживали арифметику с плавающей запятой для представления дробных значений, поэтому целые числа использовались для хранения представлений реальных значений путем применения масштабного коэффициента к реальному значению. Аналогичным образом, поскольку аппаратная арифметика имеет фиксированную ширину (обычно 16, 32 или 64 бита , в зависимости от типа данных ), масштабные коэффициенты позволяют представлять большие числа (путем ручного умножения или деления на указанный масштабный коэффициент), хотя и за счет точности. [1] По необходимости это было сделано программно , поскольку аппаратное обеспечение не поддерживало дробное значение. Масштабные коэффициенты также используются в числах с плавающей запятой и чаще всего представляют собой степени двойки . Например, формат двойной точности выделяет 11 бит для коэффициента масштабирования ( двоичная экспонента) и 53 бита для мантиссы , что обеспечивает различную степень точности для представления различных диапазонов чисел и расширяет диапазон представимых чисел за пределы того, что могло бы быть. быть представлено с использованием 64 явных битов (хотя и за счет точности). [2]
В качестве примера потери точности можно привести 16-битное без знака целое число ( uint16 ), которое может содержать только значение до 65 535 10 . используются беззнаковые 16-битные целые числа Если для представления значений от 0 до 131 070 10 , то масштабный коэффициент 1 ⁄ 2 Будет введено , так что масштабированные значения точно соответствуют реальным четным целым числам . Как следствие, например, число 3 не может быть представлено, потому что сохраненная 1 представляет реальную 2, а сохраненная 2 представляет реальную 4; в этом представлении недостаточно битов, чтобы избежать этой ошибки.
Операции над масштабированными значениями
[ редактировать ]После того как масштабированное представление реального значения сохранено, масштабирование часто можно игнорировать до тех пор, пока значение не вернется в «реальный мир». Например, добавление двух масштабированных значений так же допустимо, как и изменение масштаба значений, сложение реальных значений и последующее масштабирование результата, причем первое гораздо проще и быстрее. Однако в любом подходе два добавленных числа должны масштабироваться одинаково. [3] Для других операций масштабирование очень важно.
Например, при умножении необходимо учитывать, что оба числа масштабируются. В качестве примера рассмотрим два реальных A и B. значения Реальное умножение этих реальных мировых ценностей таково:
A * B = P
Если вместо этого они представлены с масштабным коэффициентом Z и эти масштабированные представления впоследствии умножаются, результат будет следующим:
AZ * BZ = Q
AZ — это масштабированное реальное значение A просто произведение A * Z , а BZ — это масштабированное представление B. или После масштабированного умножения ответ не записывается PZ , поскольку значение, хранящееся в PZ, является не ответом. В этом можно убедиться, изменив оператор, где каждая строка в следующем эквивалентна:
AZ * BZ = Q A * Z * B * Z = Q (A * B) * Z * Z = Q P * Z * Z = Q PZ * Z = Q
В строке 4 P заменяет A * B. Отсюда следует, что результатом AZ * BZ (то есть Q ) является не PZ , а скорее PZ * Z. Если бы PZ был ответом, его можно было бы сохранить напрямую, поскольку в него встроен масштабный коэффициент, как в случае сложения и вычитания . Однако для умножения в произведение двух масштабированных значений встроено дополнительное масштабирование. Пока это принимается во внимание, по-прежнему нет необходимости преобразовывать AZ и BZ в A и B перед выполнением операции; результат необходимо разделить на Z перед сохранением его обратно. После этого PZ будет сохранен как результат умножения, который действительно является масштабированным представлением результата A*B (искомый ответ), а не результата AZ*BZ (который все еще масштабируется).
Распространенные сценарии масштабирования
[ редактировать ]Дробные значения, масштабированные до целых чисел
[ редактировать ]Как описано ранее, многие старые процессоры (и, возможно, некоторые современные) не поддерживают дробную арифметику. В этом случае дробные значения можно преобразовать в целые числа, умножив их на десять в степени десятичной желаемой точности. Другими словами, чтобы сохранить n цифр справа от десятичной точки , необходимо все число умножить на 10. н . В компьютерах, выполняющих вычисления в двоичном формате, действительное число умножается на 2. м сохранить m цифр справа от двоичной точки ; альтернативно, можно немного сдвинуть значение на m позиций влево. Например, в следующем наборе реальных дробных значений все они имеют три цифры справа от десятичной точки:
15.400, 0.133, 4.650, 1.000, 8.001
Чтобы сохранить всю эту информацию (другими словами, не потерять точности ), эти числа необходимо умножить на 10. 3 (1000), что дает целочисленные значения:
15400, 133, 4650, 1000, 8001
Из-за ценности масштабированных чисел их нельзя сохранить в виде 8-битных целых чисел; для них потребуется как минимум 14 беззнаковых битов или, что более реалистично, 16.
Целые значения в дроби
[ редактировать ]Некоторые процессоры, особенно DSP, распространенные в индустрии встраиваемых систем , имеют встроенную поддержку арифметики с фиксированной запятой , например форматов Q и IQ .
Поскольку дробная часть числа занимает несколько битов в поле, диапазон значений, возможных в фиксированном значении, меньше, чем то же количество битов, которое можно было бы предоставить целому числу. [4] Например, в 8-битном поле целое число без знака может хранить значения от [0, 255], но в поле с фиксированной запятой без знака с 5 битами, выделенными для дробной части, для целочисленного значения осталось только 3 бита, и поэтому можно хранить только целочисленные значения из [0, 7]. (Количество различных значений, которые могут храниться в двух полях, одинаково: 2 8 = 256, поскольку поле с фиксированной запятой также может хранить 32 дробных значения для каждого целочисленного значения.) Поэтому обычно коэффициент масштабирования используется для хранения реальных значений, которые могут быть больше максимального значения формата с фиксированной запятой. .
Например, при использовании беззнакового 8-битного формата с фиксированной запятой (который имеет 4 целочисленных бита и 4 дробных бита) наибольшее представимое целое значение равно 15, а наибольшее представимое смешанное значение равно 15,9375 (0xF.F или 1111,1111 b). ). Если желаемые реальные значения находятся в диапазоне [0,160], их необходимо масштабировать, чтобы они соответствовали этому представлению с фиксированной точкой. Масштабный коэффициент 1 ⁄ 10 нельзя , потому что масштабирование 160 на здесь использовать 1 ⁄ 10 дает 16, что больше, чем наибольшее значение, которое можно сохранить в этом формате с фиксированной запятой. Однако, 1 ⁄ 11 будет работать как масштабный коэффициент, поскольку максимальное масштабированное значение 160 ⁄ 11 = 14,54 соответствует этому диапазону. Учитывая этот набор:
154, 101, 54, 3, 0, 160
Масштабирование их с помощью масштабного коэффициента 1 ⁄ 11 дает следующие значения:
154/11 = 14 101/11 = 9.1818... 54/11 = 4.9090... 3/11 = 0.2727... 0/11 = 0 160/11 = 14.5454...
Многие из этих значений были усечены, поскольку они содержат повторяющиеся десятичные дроби , что следует из выбранного масштабного коэффициента (одиннадцатые числа не оканчиваются десятичной дробью). При сохранении их в нашем формате с фиксированной запятой некоторая точность будет потеряна (в отличие от точных значений исходных целых чисел). Это также проблема, поскольку 8-битный формат может хранить 256 различных значений, но числа в этом наборе находятся в диапазоне только с 161 возможным значением (от 0 до 160). Как оказалось, проблема заключалась в масштабном факторе, 1 ⁄ 11 , что приводило к ненужным требованиям точности и ошибке округления (при аппроксимации реального значения ближайшим представимым значением). [5] Чтобы избежать или решить эту проблему, необходимо выбрать лучший масштабный коэффициент.
Выбор масштабного коэффициента
[ редактировать ]Приведенный выше пример иллюстрирует, как определенные масштабные коэффициенты могут вызвать ненужную потерю точности или ошибку округления, подчеркивая важность выбора правильного масштабного коэффициента. Используя масштабный коэффициент 1 ⁄ 11 и преобразуя в двоичные представления, получаем следующие значения:
154/11 = 14 = 1110.0 101/11 = 9.1818... = 1001.00101110... 54/11 = 4.9090... = 100.111010... 3/11 = 0.2727... = 0.010010... 0/11 = 0 = 0.0 160/11 = 14.5454... = 1110.10010...
Для некоторых двоичных дробей требуется более четырех дробных битов, предусмотренных установленным форматом с фиксированной запятой. (Отчасти это связано с тем, что одиннадцатые числа также не оканчиваются двоичным кодом.) Чтобы разместить их в полях (4 целых и 4 дробных бита), можно усечь оставшиеся биты, дав следующие сохраненные представления:
1110.0000 1001.0010 0100.1110 0000.0100 0000.0000 1110.1001
Или в десятичном формате:
14.0 9.125 4.875 0.25 0.0 14.5625
Когда их вызывают обратно в реальный мир, они делятся по масштабному коэффициенту: 1 ⁄ 11 . Это обратное исходному масштабированию, дающее следующие значения «реального мира»:
154.0 100.375 53.625 2.75 0 160.1875
Эти значения не эквивалентны оригиналам (до масштабирования и соответствия этому 8-битному представлению). Наиболее заметно то, что они больше не являются целыми числами, что сразу указывает на то, что в хранилище возникла ошибка из-за неправильного выбора коэффициента масштабирования.
Выбор лучшего масштабного коэффициента
[ редактировать ]Большинство наборов данных не имеют идеального масштабного коэффициента; скорее всего, в процессе масштабирования возникнет какая-то ошибка. Однако возможно выбрать лучший масштабный коэффициент. Идеальный масштабный коэффициент может быть не самым маленьким, а скорее таким, который сохраняет как можно большую точность.
Деление числа на степень двойки аналогично сдвигу всех битов вправо один раз для каждой степени двойки. (Это двоичный эквивалент смещения всех десятичных цифр влево или вправо при соответственно умножении или делении на степени десяти.) Порядок битов не меняется, он просто перемещает количество разрядов, равное двоичному показателю степени ( например, 3 позиции вправо при делении на 8 = 2 3 ). С другой стороны, при делении на число, которое не является целой степенью двойки в двоичном формате, битовая комбинация меняется. Это, вероятно, приведет к созданию битовой комбинации с большим количеством битов справа от двоичной точки, искусственно вводя требуемую точность. Это особенно верно, когда дробная часть имеет знаменатель, не являющийся степенью двойки, поскольку все дроби, не обратные степеням двойки, повторяются в двоичной системе. [6] Поэтому почти всегда предпочтительнее использовать масштабный коэффициент, равный степени двойки. Биты, которые в результате усечения смещаются сразу за конец поля, все равно можно потерять, но это позволяет избежать введения новых битов, которые будут неточными (из-за ошибки округления) или усеченными. [6]
В качестве иллюстрации можно использовать степени двойки в масштабном коэффициенте, масштабном коэффициенте 1 ⁄ 16 можно применить к приведенному выше набору данных. Двоичные значения исходного набора данных приведены ниже:
154 = 1001 1010 101 = 0110 0101 54 = 0011 0110 3 = 0000 0011 0 = 0000 0000 160 = 1010 0000
Будучи целыми числами от 0 до 255, все они могут быть представлены точно с помощью 8 бит. Масштабируя их по 1/16 это то же самое, что деление на 16, что то же самое, что сдвиг битов на — 4 позиции вправо. В этом случае масштабирование осуществляется путем вставки двоичной точки между первыми 4 битами и последними 4 битами каждого числа. Это соответствует заранее определенному формату этого представления. Следовательно, поскольку для представления всех этих чисел в виде целых чисел не требуется более 8 бит, для их уменьшения и сохранения в формате с фиксированной запятой требуется не более 8 бит.
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Линц и Ван 2003 , стр. 12–13.
- ^ Линц и Ван 2003 , стр. 14–15.
- ^ Йейтс 2013 , с. 6.
- ^ Йейтс 2013 , стр. 4–5.
- ^ Линц и Ван 2003 , с. 18.
- ^ Jump up to: а б «Двоичные дроби» . Float-point-guide.de . Проверено 6 июля 2020 г.
- Йейтс, Р. (2013). «Арифметика с фиксированной запятой: Введение» (PDF) . Лаборатории цифровых сигналов. Архивировано (PDF) из оригинала 12 сентября 2015 г.
- Линц, П.; Ван, RLC (2003). Изучение численных методов: введение в научные вычисления с использованием MATLAB . Издательство Джонс и Бартлетт . ISBN 0-7637-1499-2 .