Что такое точность?

Поговорим сегодня о точности.

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

Большая политехническая энциклопедия [1] термин точность трактует как «степень приближения истинного значения рассматриваемых параметров изделия, вещества, системы или процесса к истинному или теоретическому номинальному значению».

Рассмотрим это определение относительно числовых объектов.

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

Так, для двух пар сравниваемых чисел x1=1230, x2=1234  и x1=1230, x2=1229, более близкими являются числа второй пары. Т.к. в первой паре разница между числами |x1-x2|=4, а для второй пары |x1-x2|=1. Заметим, что все цифры в сравниваемых здесь числах нам известны, поэтому абсолютную погрешность мы можем вычислить точно.

В [1] дано также другое определение точности. Точность, это «значение максимальной погрешности результата вычислений» на компьютере. Это определение предполагает, что для некоторого приближенного результата вычислений x есть  приближенное число X, для которого справедливо соотношение X = x ± Δmx. Где Δmx — максимальная возможная погрешность результата вычислений. Чаще всего  Δmx    вводится в том случае, когда точного значения разницы между числами определить невозможно, а известно  только максимальное значение, которого может достичь абсолютная погрешность.  Такая ситуация, как правило, возникает при проведении каких-либо измерений.

В литературе по компьютерной арифметике принята другая интерпретация термина точность. В ней под точностью понимается  количество значащих цифр в числе, разрядность которого по каким-либо причинам ограничена. Для чисел с плавающей точкой это равнозначно количеству разрядов  p мантиссы числа, представленного в двоичном экспоненциальном виде. Такую точность в англоязычной литературе  принято обозначать термином precision.

Итак, у нас имеется некоторое десятичное число x, которое мы представляем в компьютере в двоичном экспоненциальном виде как x= (-1)^S*M2^e. Где S- код знака, M -двоичная мантисса, как правило, нормализованная, 2^e — характеристика, e- порядок или экспонента, возможно со смещением.

Десятичное число x может быть любым вещественным числом, в том числе  в виде правильной дроби. На практике, как правило, принято  представлять числа с дробной составляющей в виде десятичной дроби. Не все рациональные числа можно представить в виде конечной десятичной дроби. Например, 1/3=0.333… является бесконечной десятичной дробью.

Число, представленное в виде бесконечной дроби называется числом, представленным с бесконечной точностью.

Число, представленное конечным количеством значащих цифр, называется представимым.

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

На практике, для нужд округления, в числе бесконечной точности достаточно  рассмотреть ограниченное количество значащих цифр , превышающее  число значащих цифр, до которого требуется выполнить округление. Такое число, по отношению к округленному числу,  можно считать числом условно бесконечной точности. Например, для правильного округления   бесконечной десятичной дроби 0.3333…. до 3 значащих цифр достаточно взять только первые 4 значащие цифры.

 

В нашем  примере мы имеем число x=1/3, представленное десятичной дробью с точностью до 3 значащих цифр и с погрешностью dx. Здесь видно, что понятие точности (precision) и понятие погрешности не совпадают по смыслу. Действительно, если нам говорят, что нам дано  число, представленное, например, с точностью (precision) до 3 значащих цифр, мы  ничего не можем сказать о его погрешности представления. Например, число 0.333 может быть и точным (exact) и для него погрешность dx=0. Поэтому для компьютера все числа на входе являются точными  (exact),  т.е. представимыми. И если в процессе вычислений не произошло переполнения, то и полученный результат также является точным (exact).   

Кроме рассмотренных двух понятий точности — precision и exact в англоязычной литературе существует еще одно понятие — accuracy. Это понятие точности  больше подходит к точности арифметических вычислений. Это понятие  очень хорошо сформулировано в  [3]. «Этот термин (accuracy), используется  для описания всего, что близко к его истинному значению или общепризнанному стандарту. Например, компьютер может выполнить точное математическое вычисление, которое является правильным с предоставленной информацией, но не является точным значением»

Это определение очень важно для понимания погрешностей вычисления десятичных чисел средствами двоичной арифметики.

Суть приведенного определения точности в следующем. Если на вход вычислительного устройства поступают два приближенных числа x1 и x2, а возвращается  приближенное число X,  то результат работы вычислительного устройства  считается точным в смысле accuracy, если он совпадает с результатом,  подсчитанным вручную, в предположении, что  x1 и x2 — числа бесконечной точности.

В общем случае, если число X = x1©x2, где © — любая арифметическая операция, выполненная устройством, совпадает с результатом, вычисленным вручную, то такой результат является правильным (accuracy). При этом интегральный интервал неопределенности для X будет складываться из ошибок, заложенных  во входных числах x1 и x2 и ошибок округления при вычислениях. С правилами приближенных вычислений можно ознакомиться в [4].

Рассмотрим сумму двух дробных чисел 1/3 и 1/7.  Нас будет интересовать результат в виде десятичной дроби с точностью до 3 значащих цифр. Точная сумма этих чисел, вычисленная вручную, даст правильный результат (accuracy) 1/3+1/7=10/21. Как мы уже отмечали, в научных и инженерных приложениях чаще всего дело имеют не с рациональными числами в виде правильных дробей, а с числами с десятичными дробями, т.к. их анализировать намного проще. Кроме того,  вычисления с числами, представленными в виде правильных дробей, реализовать на компьютере гораздо сложнее. 

Дробное десятичное число бесконечной точности для нашей суммы будет 10/21= 0,47619047… .  Округлим его до 3 значащих цифр и получим ответ  X = 0.476. Это правильный ответ.

Представим наши слагаемые в виде десятичных дробей с бесконечной точностью. Получим числа условно  бесконечной точности:  1/3 = 0.33333.  и 1/7 = 0.14285 . Поскольку нас интересует ответ с точностью до 3 значащих цифр, округлим эти числа соответствующим образом. Будем иметь x1 ≈ 0.333, x2 ≈ 0.143. Сумма этих чисел даст X = 0.476. Мы получили ответ, вычисленный вручную по известным правилам для десятичных дробей. Он совпадает с ответом, приведенным выше. Т.е. это правильный (accuracy)  ответ.

Предположим теперь, что мы хотим получить ответ  с точностью до 2 значащих цифр, тогда  x1 ≈ 0.33, x2 ≈ 0.14 и X=0.47.  В то время как округленное до двух значащих цифр число 0.47619047…,  будет равно 0.48. Мы получили неправильный ответ. Для получения правильного ответа нам не хватило количества цифр для правильного округления в слагаемых. 

В обоих случаях, с точки зрения количества значащих цифр p (precision), мы получили результат точный, но во втором случае, с точки зрения правильности вычислений (accuracy), мы получили результат неверный. 

Рассмотрим теперь сумму двух дробных двоичных чисел условной бесконечной точности y1 =  0.01010101001111110111 и y2 = 0.00100100100110111010. Она равна 0.01111001110110110001. С точностью до 16 значащих цифр эта сумма будет равна Y= 0.01111001110110110.

Вычислим эту сумму с помощью 16-ти разрядного сумматора.  Для этого на входе округлим наши слагаемые бесконечной точности до 16 значащих цифр. Будем иметь y’1 =  0.01010101001111111 и y’2 = 0.01111001110110111. Сумма этих чисел будет равна 0.011110011101101101. Округлив ее до 16 значащих цифр, на выходе мы получим Y’= 0.01111001110110111. Мы получили точный ответ в смысле (precision) и неточный в смысле (accuracy). Для того, чтобы получить правильный ответ, вычисления надо выполнять в расширенном формате, чтобы учесть больше цифр при округлении.

Возьмем для вычисления суммы наших чисел 17-разрядный сумматор. Тогда на вход сумматора подадим округленные до 17 значащих цифр слагаемые: y’1 =  0.010101010011111110  и y’2 = 0.0010010010011011101. Сумма этих слагаемых будет равна 0.0111100111011011001. Округленная до 16 значащих цифр она будет равна 0.01111001110110110, что совпадает с вычисленным вручную результатом. Мы получили точный ответ в смысле (precision) и точный в смысле (accuracy).

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

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

Мы не будем здесь рассматривать подробно причины этой проблемы. Их мы рассмотрим в других статьях нашего блога. Здесь же на примерах продемонстрируем, что понятие точности в смысле (accuracy)  по отношению к десятично-двоичным вычислениям иногда невозможно достичь даже при использовании  формата удвоенной точности.

Начнем с  суммы двух десятичных дробей x1 = 0.1234  и x2 = 0.4321. Сумма этих чисел, вычисленная с точностью до 3 значащих цифр, будет равна X=0.1234  + 0.4321=0.5555≈0.556. Абсолютная ошибка округления составляет  Δx = |0.5555-0.556|=0.0005.

Представим наши числа x1 и x2 двоичными числами бесконечной точности:  Y1 = 0.0001111110010111…, Y2  = 0.0110111010011110 … . Предположим, нас интересует десятичный   результат  с точностью до 3 десятичных цифр, полученный с помощью двоичной арифметики. Чтобы однозначно представить трехзначное десятичное число, нам потребуется 10 разрядов двоичного кода. Округлим наши двоичные числа бесконечной точности до 10 значащих цифр. Получим следующие числа Y’1 = 0.0001111110011, Y’2 =  0.01101110101.  Десятичные эквиваленты этих чисел будут  x’1 = 0.1234130859375,  x’2 =  0.43212890625. В каждом из этих чисел имеется по 3 верных цифры.

Десятичное число x’1 является представимым числом  ближайшим к x1=0.1234.  Проверим это.   Найдем   Y’1 + 10^-13= 0.0001111110100= 0.12353515625 ≈ 0.1235, Y’1 — 10^-13= 0.0001111110010= 0.123291015625≈0.1233. Мы видим, что в обоих этих случаях мы получаем число с большей ошибкой, чем для двоичного эквивалента числа 0.1234,  равного  0.0001111110011. Следовательно, число x’1=Y’1 является ближайшим к  0.1234.  Легко проверить, что то же относится и к  числу Y’2.

Таким образом, в результате конвертации десятичных чисел x1, x2 в двоичный код мы получили двоичные эквиваленты Y’1, Y’2 этих чисел, десятичные значения которых являются представимыми числами ближайшими к x1, x2. 

Сумма Y = Y’1+ Y’2= 0.1000111000111, округленная до 10 значащих цифр  будет равна Y’ = 0.1000111001 =0.5556640625. Если округлить это десятичное число до 3 значащих цифр, мы получим число 0.556, которое совпадает с вычисленным вручную числом X.  Но вся проблема в том, что двоичное число 0.1000111001 никаким образом нельзя округлить так, чтобы получить округленное десятичное  число 0.556. Сколько бы значащих двоичных цифр мы не брали, все равно мы будем иметь бесконечное количество неучтенных двоичных цифр, которые образуют ошибку округления непредставимого десятичного числа.

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

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

 

Литература

  1. Большая политехническая энциклопедия https://polytechnic_dictionary.academic.ru/2771/
  2. https://ru.wikipedia.org/wiki/IEEE_754-2008
  3. https://www.computerhope.com/jargon/a/accuracy.htm
  4. http://khpi-iip.mipk.kharkiv.edu/library/datastr/book_sod/structura/chapter8.htm

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

Один комментарий

  • поделки на рождество инструкция

    This blog was… how do you say it? Relevant!! Finally I have found something that helped me. Cheers!| а

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

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