В данной главе речь пойдёт о преобразовании числовых величин из одной формы представления в другую. Наряду с арифметическими операциями данный аспект программирования является основополагающим.
Большая часть информации в электронно-вычислительной системе всегда представлена в позиционном двоичном коде. Система команд любого микропроцессора напрямую поддерживает числа только такого типа. Для взаимодействия с пользователем (когда необходима визуализация или ввод/вывод информации) используется более привычная десятичная система исчисления, что приводит к необходимости отображать в памяти такие данные в виде двоично-кодированных десятичных цифр (двоично-десятичном коде). Помимо этого существует ещё множество других форматов, которые необходимы для реализации интерфейса с разного рода периферийными узлами (микросхемами памяти, логики, датчиками и т.д.). Во всех этих случаях задача преобразования требует частных способов решения.
Изменение масштаба числовых величин
В вычислениях часто приходится умножать числа на какой-либо фиксированный коэффициент. Если этот коэффициент является целочисленной величиной, то проблем не возникает (используется операция целочисленного умножения). Но бывает и так, что константа число иррациональное. Для того чтобы избежать использования арифметики с фиксированной или плавающей запятой, нужно представить иррациональную константу k в виде обыкновенной правильной/неправильной дроби
k = a/b.
В этом случае действие умножения на дробное число k будет сведено к двум целочисленным операциям умножения на числитель a и деления на знаменатель b.
Вычисления могут быть заметно упрощены, если в качестве b выбрать число кратное целой степени 2. Тогда процедуру деления можно будет свести к простому сдвигу делимого вправо на соответствующее число разрядов:
В таких расчётах нужно обращать внимание на очерёдность выполнения арифметических операций. Первой всегда должна следовать операция умножения, а уже за ней деление. После целочисленного деления в общем случае образуется остаток, который, если его не учитывать, вносит в процесс вычислений систематическую погрешность δ. В дальнейших расчётах эта погрешность может многократно возрасти и изменить результат до неузнаваемости. При умножении целого числа X на дробь a/b получим
(X/b + δ)*a = X*(a/b) + a*δ.
На этапе деления была получена абсолютная погрешность δ, которая в итоге возросла в a раз. В тоже время подобного рода погрешность не увеличится, если деление и умножение поменять местами
(X*a)/b = X*(a/b) + δ.
Чем позднее в вычислениях (в порядке следования математических операций) будет внесена погрешность – тем точнее результат будет получен.
Что же касается точности, с которой должен быть представлен множитель k, то, при желании, она может быть сколь угодно велика при соответствующем подборе a и b. Только не всегда стоит к этому стремиться. Если программа обрабатывает n-разрядные данные прототипом, которых являются реально измеренные физические величины, то относительная погрешность их представления не может быть, ниже 1/2n. Это связано как с дискретностью измерений, так и с ограниченной точностью любых измерительных приборов. В этом случае вполне достаточно иметь точность представления k такого же порядка. При использовании встроенного аналого-цифрового преобразователя, разрешение которого составляет 10 значащих разрядов (минимальная относительная погрешность 1/210 ≈ 0,1%), не имеет смысла для умножения результата, например, на k = π/2 √2 ≈ 1,11072… брать больше одного - двух разрядов после запятой (т.е. брать k c точностью более 0,1%).
Перейти к следующей части: Преобразование из десятичной системы в двоичную
Комментарии (0)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация