Десятично-двоичная арифметика

В своих статьях мы все время говорим о десятично-двоичных вычислениях. При этом мы имеем в виду, что на входе и выходе вычислительного устройства числа представлены в привычном для нас десятичном виде. Например, как в популярном приложении Excel. Причем, в самом устройстве все вычисления выполняются в двоичном коде. Мы не будем рассматривать здесь десятичную арифметику, которая эмулируется в вычислительном устройстве BCD кодами, так как такая арифметика выполняет десятичные вычисления над десятичными числами. Остановимся на двоичной аппроксимации десятичных вычислений.

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

В практических научных и инженерных расчетах, как правило, все вычисления выполняются в десятичной арифметике с определенной заданной точностью. Для десятичных чисел с плавающей точкой эта точность задается количеством N значащих цифр. Десятичные числа, полученные с количеством значащих цифр, превышающим  заданную точность вычислений, округляют до нужного значения N цифр этого десятичного числа. Цифры, стоящие правее N-той значащей цифры, считаются «мусором» и отбрасываются при округлении. Десятичные вычисления над десятичными числами ограниченной точности выполняются по известным правилам приближенных вычислений. При вычислениях же в десятично-двоичной арифметике мы сталкиваемся с проблемой округления до N значащих цифр десятичного числа, представленного в двоичном виде.

Зададимся вопросом, а что значит число, представленное в десятичном виде? Или, число, представленное в двоичном виде? И вообще, что значит число? Для ответа на этот вопрос обычно, для наглядности, рассматривают числовую ось, состоящую из бесконечно большого количества, бесконечно близко расположенных друг к другу точек.  Эти точки образуют непрерывное множество (континуум) точек. Тогда число, в таком представлении, это просто координата бесконечно малой точки на числовой оси относительно выбранной начальной точки. Когда мы выполняем арифметические преобразования над координатами двух произвольно взятых точек, мы устанавливаем некоторые соотношения, которыми связаны  координаты эти точки. Мы устанавливаем функциональную связь между выбранными, в пределах области определения, координатами точек на цифровой оси и точкой на той же оси, координата которой функционально связана с координатами выбранных точек. Выбранные точки на цифровой оси называются аргументами, а математические операции (+,-,× ,/,  и др.), определяют функциональную зависимость между этими аргументами. Важно отметить, что здесь речь идет именно о точках на числовой оси, которые могут быть обозначены абстрактными символами. Например, выбрав на цифровой оси некоторую начальную точку О, которую мы примем за нуль, а также точки В и А, находящиеся на расстоянии ОВ и ОА от точки О, можно найти точку С, которая определяется как разность ОС = ОВ — ОА. Отрезок ОС на числовой оси можно построить  с помощью обычного циркуля, не прибегая ни к каким числам. Для этого отмерим циркулем отрезок между точками  А и В и затем отложим его относительно точки О. Таким образом мы решили задачу по нахождению точки С на числовой оси, не прибегая к числовым координатам точек.

Но  бывают случаи, когда величину ОС нельзя измерить, а надо вычислить по известным значениям ОА и ОВ. Кроме того, часто возникает необходимость зафиксировать и  передать информацию о величине отрезка ОС для дальнейшего анализа. Для этого  нам понадобится какая-то мера, измерительный инструмент. Градуировка измерительного инструмента может быть любая. Она может быть кратна миллиметру, дюйму, футу или любой другой произвольной мере.

Рассмотрим следующий пример. Пусть нам даны три отрезка – OA, OB  и ОС на полупрямой с началом отсчета в точке O. Предположим, что OB > OA и  OC = OB — OA.

Возьмем  линейку с ценой деления 0.2 мм, в которой расстояние между соседними рисками равно  0.2 мм.  Измерим отрезки OB и OA этой линейкой. Допустим, наши точки оказались между рисками с номерами  107 ≤ OB ≤ 108  и 83 ≤ OA ≤ 84, что в миллиметрах составляет   21.4 мм ≤ 107·0.2 ≤ 21.6  и   16.6 мм ≤ 83·0.2 ≤ 16.8 мм. В этом случае погрешность измерения равна 1/2 цены деления. Следовательно, OB = (21.5± 0.1)мм, OA = (16.7 ± 0.1)мм.  Вычислим разность ОС = 0B — 0A. Будем иметь ОС = (21.5± 0.1)мм — (16.7± 0.1)мм = (4.8±0.2)мм. Таким образом, наша искомая точка  лежит где-то в интервале 4.6 мм…5 мм.  Так мы определили длину отрезка ОС на числовой оси в миллиметрах с погрешностью ±0.2 мм.

Допустим теперь, что нас интересует длина отрезка ОС с точностью ±1 мм. Измерив отрезки OB и OA линейкой с ценой деления 1 мм, мы получим OB = (21.5± 0.5)мм, OA=(16.5 ± 0.5)мм.  Вычислим разность 0B — 0A. Будем иметь (21.5± 0.5)мм — (16.5± 0.5)мм = (5±1) мм. Т.е.  наша искомая точка  лежит где-то в интервале 4 мм…6 мм.

Сравним  результаты измерения, выполненные линейкой с ценой деления 0.2 мм и линейкой с ценой деления 1мм.  Вычисленная разность в первом случае  имеет  значение (4.8±0.2)мм, которое лежит в интервале  4.6мм…5.0мм. Этот интервал полностью попадает в интервал 4мм…6мм для линейки с ценой деления 1мм. Имея измерения, сделанные линейкой с ценой деления 0.2 мм, мы легко можем получить результат с точностью ± 1 мм, округлив число 4.8 до 5. Отсюда следует, что если нас интересует точность вычислений не хуже (и не лучше) чем  ± 1мм., то добиваться повышения точности измерения отрезков ОА и ОВ не имеет смысла, т.к. более высокая точность предполагает большее количество цифр в представлении результата. Но нам этого не надо. 

Рассмотрим другой пример. Пусть на числовой оси гипотетически находится  некоторая бесконечно малая точка А, как показано на рис.1а. Выберем на этой оси некоторую бесконечно малую точку отсчета О такую, что  ОA = 1.372…мм. Количество значащих цифр в этом числе после цифры 2 нам не известно. Поэтому и точное значение ОА нам не известно. Измерим величину отрезка ОА линейкой с ценой деления 1/8 = 0.125 мм. Будем называть такую линейку двоичной. В этом случае, точка А на числовой оси (см. на рис.1а) будет лежать между двумя рисками 10/8 и 11/8 двоичной линейки. Поэтому отрезок ОА ≈ 0.125 ·(10.5±1/2)мм или (1.3125±0.0625)мм.

Десятично-двоичная арифметика

Рис. 1

Предположим теперь, что нас интересует координата точки А с точностью ±0.5 мм. Для ее определения возьмем десятичную линейку с ценой деления 1 мм и измерим длину отрезка ОА (см. рис. 1b). Мы видим, что точка А лежит между двумя рисками 1мм и 2мм. Следовательно, отрезок ОА имеет длину (1.5±0.5) мм. Это тот ответ, который мы хотели бы получить.

Но, если мы не имеем десятичной линейки, а имеем только данные, измеренные двоичной линейкой, то, как нам получить ту десятичную точность, которая нас устроит? Число, измеренное двоичной линейкой, назовем его двоичным, равно  (1.3125±0.0625)мм и лежит в интервале 1.25 мм…1.375 мм. Десятичное число (1.5±0.5) мм, которое мы должны получить, измеряя десятичной линейкой, лежит в интервале 1 мм…2 мм. Очевидно, что наше двоичное число, поскольку оно более точное, попадает в интервал возможных значений десятичного числа (1.5±0.5) мм. Преобразование более точного двоичного числа (1.3125±0.0625)мм в десятичное число (1.5±0.5) мм назовем правильным округлением десятичного числа, представленного в двоичном коде.

Если мы возьмем двоичную линейку с ценой деления 1/16 = 0.0625 (см. рис. 1с) и измерим отрезок ОА, то увидим, что точка А расположена между рисками 21/16 = 1,3125 и 22/16 = 1,375 и, следовательно, отрезок ОА = (21.5/16±1/32) мм = (1,34375±0,03125) мм. Он лежит в интервале  1,3125 мм … 1,375 мм.  Очевидно, что мы получили  значение отрезка ОА еще более  точное, чем в предыдущем случае. Но, для того, чтобы получить ответ на поставленную задачу, мы должны преобразовать это число к виду  (1.5±0.5) мм. Т.е. сделать правильное округление числа (1,34375±0,03125) мм, чтобы получить тот же ответ, что и для случая с более крупной ценой деления.

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

Отсюда можно сделать следующие выводы.

  1. Положение произвольной точки на числовой оси может быть выражено вещественным числом, представленным в любой системе счисления с любой заданной конечной точностью.
  2. Если точка на числовой оси представлена в виде вещественного числа в одной системе счисления, а все вычисления ведутся в другой системе счисления, то такая арифметика будет смешанной.
  3. Если входные и выходные данные представлены в десятичной арифметике, а вычисления выполняются в двоичной арифметике, то такая арифметика будет десятично-двоичной.
  4. В десятично-двоичной арифметике двоичные вычисления аппроксимируют десятичные вычисления. Можно говорить, что в десятично-двоичной арифметике двоичная арифметика аппроксимирует десятичную арифметику.
  5. Любое вещественное десятичное число с плавающей точкой может быть представлено в двоичном виде со сколь угодно малой погрешностью за счет увеличения разрядов мантиссы (точности).
  6. Положение точки на числовой оси, определяемое десятичным числом с заданной точностью, не зависит от повышения точности двоичной аппроксимации этого десятичного числа сверх определенного минимального значения.

Я изобретатель, имею 18 авторских свидетельств СССР на изобретения и два патента. Последние несколько лет занимаюсь исследованием проблем компьютерной математики.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *