Сегодня мы продолжим разговор о точности вычислений, причем он уже будет касаться не только ЭВМ. Не смотря на то, что термины разрешающая способность и погрешность обычно применяются к измерительным приборам в метрологии, они имеют отношение и к самой обычной математике. Когда мы ее используем для расчетов даже на листке бумаги.
В предыдущей статье
мы уже касались вопросов точности как представления чисел, так и вычислений. Не смотря на то, что разговор шел о вычислительных машинах, затронутые вопросы имеют самый общий характер.
И сегодня мы увидим, что не только в метрологии, но и в математических расчетах, разрешающая способно и точность это совсем не одно и тоже!
Разрешающая способность реального мира и математика
С точки зрения математики, числа образуют непрерывные и бесконечные множества значений. Во всяком случае, действительные, вещественные, числа. Можно сказать, что математика рассматривает числа как аналоговые величины. Что это означает?
Мы можем взять любые два числа, сколь угодно близкие. И в промежутке между этими числами можно разместить любое (даже бесконечное!) количество других чисел. Два числа образуют на числовой прямой отрезок, который можно разделить на еще более мелкие отрезки. И каждый из этим мелких отрезком мы можем делить на еще более мелкие. И так до бесконечности.
Конечно, речь не идет о целых числах. Целые числа образуют бесконечное, но дискретное множество. Мы не можем разместить между двумя соседними целыми числами ни одного дополнительного числа. Но самые интересные для нас числа, действительные, образуют непрерывное множество. Комплексные числа тоже образуют непрерывное бесконечное множество. Но если действительные числа можно представить в виде числовой оси, то комплексные числа уже в виде числовой плоскости.
Но в реальном, а не идеальном математическом, мире непрерывность превращается в дискретность. На практике непрерывность недостижима. И это касается не только ЭВМ. И при вычислении в уме, и при вычислении на листке бумаги, и при использовании логарифмической линейки, мы записываем ограниченное количество цифр чисел. И тем самым порождаем дискретность.
Причем эта дискретность является неустранимой. Мы можем записывать очень большое количество цифр в числах, но некоторые числа все равно не получится записать абсолютно точно. Примерами таких чисел являются число e (число Эйлера) и число π (число Пи).
Intel, документацию которой на их FPU мы уже использовали в предыдущей статье, иллюстрирует дискретность машинного представления действительных чисел так
В самом верху изображена числовая ось, непрерывная и бесконечная, на которой располагаются действительные числа. Чуть ниже показано подмножество действительных чисел, уже дискретное, которое образуют представимые в машине числа. В самом низу, в виде "картинки под микроскопом" показано, что в машинном представлении между числами образуются неустранимые промежутки. Числа, попавшие в эти промежутки, не могут быть представлены точно. Мы будем вынуждены использовать одно из близлежащих чисел для их представления.
Думаете, что это касается только вычислительных машин? Ошибаетесь! Тоже самое происходит и числами, которыми мы пользуемся при вычислениях на листке бумаги. Можно сказать, что числа, которыми мы пользуемся в реальном мире, вне зависимости от способа их представления, образуют шкалу с делениями. И мы пользуемся делениями этой шкалы для записи чисел и вычислений.
Давайте рассмотрим экспоненциальную запись действительных чисел, например, с 5 цифрами после запятой. Количество цифр порядка нам не важно, но для определенности предположим, что их две. Мантисса наших чисел будет представлена 6 цифрами. Одна до запятой и пять после запятой. Что можно сказать о двух соседних числах, которые еще будут различимы (не будут сливаться в одно число) при таком представлении?
Очевидно, что разность этих двух чисел, по модулю, должна удовлетворять условию
|x1 - x2| ≥ 0.00001
Если разность меньше, два числа будут неразличимы при записи 5 цифр после запятой. Это и есть разрешающая способность записи мантиссы. Цена деления шкалы мантиссы. Чем больше цифр в записи мантиссы, тем лучше разрешающая способность. Поэтому в ЭВМ и были введены форматы повышенной точности. Мы уже рассматривали их в предыдущей статье.
Но это касается только мантиссы, для оценки разрешающей способности всего числа нам уже требуется учитывать порядок. Предположим, наше число имеет порядок +5. И "магическим образом" последняя цифра нашей мантиссы (пятая, после запятой в ее записи) оказывается первой цифрой до запятой в числе в целом. Для мантиссы разрешающая способность не изменилась, но для числа в целом разрешающая способность гораздо хуже, всего то 1, а не 0.00001. Если порядок числа будет равен -5, то разрешающая способность записи числа будет гораздо лучше, чем разрешающая способность мантиссы.
Вот это и показано на иллюстрации Intel как различная плотность точек, дискретных представлений чисел. Чем дальше от центра числовой оси, тем больше значение порядка. И тем хуже разрешающая способность представления чисел. При ограничении количества цифр после запятой в числе.
Увеличивая количество цифр в мантиссе, количество разрядов мантиссы, мы увеличиваем, улучшаем, разрешающую способность и мантиссы, и числа в целом. Деления нашей числовой оси становятся более мелкими, а точность представления чисел растет. Но решает ли это все проблемы? Нет, не решает! И сейчас мы будем с этим разбираться.
При этом мы уже не будем рассматривать потерю точности при выполнении арифметических операций с числами с существенно различными порядками. Мы рассмотрели это в предыдущей статье.
Составляющие погрешности вычислений
Очень многие, к сожалению, попадают в ловушку "безусловно высокой точности вычислений с большим количеством разрядов" на ЭВМ. Реальность такова, что точность вычислений, погрешность вычислений, определяются далеко не только разрядностью (количеством цифр) в используемых числах. Более того, в большинстве практических случаев дискретность представления чисел (разрешающая способность) даже не стоит на первом месте при обсуждении вопросов погрешностей вычислений.
Погрешность математической модели
Математическая модель это не что-то абстрактное и статичное. Это описание на языке математики реальных процессов. И в большинстве случаев математическая модель учитывает не все тонкости реального процесса, а только самые важные. С точки зрения прикладной, практической, задачи.
Давайте начнем с чего-нибудь простого... Например, несколько человек принесли яблоки. Сколько всего яблок у нас оказалось? Мы, еще со школьной скамьи, знаем, что нельзя складывать яблоки с апельсинами, например. Но тут у нас только яблоки. Значит складываем? А если несколько яблок оказались червивыми? Должны ли мы их учитывать в общем количестве яблок?
Простая математическая модель, сумма количества яблок, оказалась определена не совсем точно. И результат использования этой модели может оказаться разным в разных ситуациях. Вы считаете, что это не неточность модели, а специфика прикладной задачи? Хорошо, тогда вот другой пример.
В курсе школьной физики, при изучении тепловых явлений, можно найти задачи на нагревание некоторого количества воды сжиганием газа или электрическим нагревателем. Выглядят эти задачи, примерно, так
"Какое количество газа с теплотворной способностью Х потребуется для нагревания Y литров воды с начальной температурой Т1 до температуры Т2. Считать, что газ сгорает полностью, а выделившееся тепло полностью идет на нагрев воды"
Знакомая задачка, правда? Сжигание газа может быть заменено на электрический нагреватель, что для сегодня не суть важно. В условиях задачи четко оговорено, что теплообмен с окружающей средой отсутствует, а газ сгорает полностью. И это автоматически делает школьную математическую модель, которая лежит в основе решения задачи, неполной. И неточной.
В реальных условиях газ сгорает не полностью. Часть выделившегося тепла уходит в окружающую среду, а не нагревает воду. Теплоемкость воды зависит от температуры. Нагреваемая вода отдает часть тепла окружающей среде. И результат расчетов, по школьной модели, будет отличаться от результатов реально проведенного эксперимента.
Неточность, упрощенность математической модели, автоматически вносит погрешность в результаты расчетов. Причем в этом случае не спасет какое угодно наращивание разрядности используемых в расчетах чисел. Точность вычислений ограничена самой математической моделью, а не дискретностью чисел.
Может показаться, что причина в крайней упрощенности школьной модели процессов. Но мы можем заглянуть в любой учебник для ВУЗов, почти в любую научную книгу, в любую книгу для инженеров, и увидим массу упрощений в описании реальных процессов. Вот небольшой фрагмент из классического учебника электроники
Исходная формула коэффициента ослабления синфазного сигнала упрощается до вида (11.6). Да, этой упрощенной формулы достаточно для практических расчетов при соблюдении указанных условий. Но даже в этом случае вычисления будут содержать погрешность, которую не устранить никаким наращиваем точности представления чисел! И погрешность будет больше, чем менее строго соблюдаются указанные условия.
Погрешность исходных данных
Числа, которые используются при вычислениях, тоже могут иметь погрешности. Причем вызванные отнюдь не ограничением их разрядности. Например, мы можем измерять температуру воды (в школьной задаче) с точностью до одного градуса. Или напряжение с точностью до 0.01 В. И эти погрешности исходных данных автоматически отражаются в погрешности результата вычислений. И никакое наращивание разрядности представления чисел не спасет!
Да, повышение разрядности представления чисел поможет снизить накапливающуюся при вычислениях погрешность. Но погрешность результата будет не меньше суммарной погрешности исходных данных. И это реалии сурового реального мира. Если мы измеряем напряжение от 0 до 100 В с точностью 10 мВ, то результат измерений будет лежать от 00.00 до 99.99. То есть, нам достаточно 4 цифр для его представления. Мы можем использовать машинное представление с 20 цифрами, но это никак не повлияет погрешность. Все равно значащими будут только 4 цифры.
Если это измерение напряжения используется для вычисления сопротивления, то количество значащих цифр в результате вычисления будет не больше 4. Мы никак не сможем повысить точность, уменьшить погрешность, результата вычислений.
Погрешность метода вычисления
Погрешность метода вычисления уже довольно близка к погрешности представления чисел. И эти погрешности иногда можно считать тождественными. Тем не менее, погрешность метода следует выделять отдельно.
Давайте представим, что в формуле, которую мы используем для вычисления, используется значение функции синуса. Как мы можем найти значение синуса для некоторого аргумента? Мы можем использовать таблицы. Например, таблицы Брадиса. В этих таблицах аргумент синуса задается с точностью до десятых долей градуса (в минутах), а значение синуса указано с 4 значащими цифрами после запятой. То есть, у нас есть ограничения и на точность аргумента, и на точность значения синуса.
Использование табличных значений функций можно условно считать эквивалентным уже рассмотренному нами ограничению точности исходных данных. Как это влияет на точность результата мы уже знаем.
Но есть и другой метод. Мы можем использовать разложение синуса, например, в ряд Тейлора
и попробовать самостоятельно вычислить его значение. Но этот ряд бесконечный, когда мы должны остановить вычисления? На практике, у нас есть только два варианта. Первый, выполнять вычисления до тех пор, пока очередной член ряда не окажется малым настолько, что будет неотличим от нуля для нашего представления чисел. Оптимальный вариант? Да, но есть один небольшой нюанс.
Дело в том, что для представления действительных чисел в формате с плавающей запятой мы очень долго не достигнем равенства нулю очередного члена ряда. У нас будет увеличиваться отрицательное значение порядка, пока мы не достигнем предела его значений, но мантисса не будет обнуляться. Мы выполним очень много лишних вычислений, бесполезных. На самом деле, нам достаточно выполнять вычисления, пока вычисленные значения синуса на предыдущем и текущем шагах не будут равны.
Но в предыдущей статье мы уже говорили, что два числа ф формате плавающей запятой не нужно слепо сравнивать. Нужно сравнивать разность чисел с некоторым пороговым малым значением. Это пороговое значение и будет определять условие окончания вычислений.
Второй вариант, просто заранее определить количество вычисляемых членов ряда.
Значение синуса можно вычислять и используя другие ряды. Для вычисления других функций могут использоваться различные методы и формулы. Не всегда погрешность вычислений можно свести к минимуму увеличивая количество итераций. Нужно понимать, что вычисление значения функции это точно такое же вычисление, как и вычисление итогового значения. Просто это небольшая часть всей работы.
Погрешность представления чисел и вычислений
И только теперь мы добрались до того, что рассматривали в предыдущей статье и начале этой статьи. В эту погрешность, кроме того, входит и погрешность преобразования между системами счисления. И погрешность округления.
И именно погрешность представления и вычислений мы можем снизить увеличивая разрядность. В меньшей степени разрядность влияет на погрешности методов вычислений. И уже совсем разрядность не влияет на погрешности исходных данных и математических моделей.
К сожалению, мой оппонент Николай не хочет этого признавать. Он полагает, что просто увеличение разрядности представления чисел автоматически решает все проблемы. Но как мы видели, это совсем не так.
Погрешности чисел и вычислений
При решении задач на ЭВМ, так же, как и при ручных расчетах, итоговая погрешность вычислений определяется суммарной погрешностью всех составляющих. И здесь есть прямая аналогия с метрологией. Причем довольно близкая аналогия. В частности, погрешности представления чисел и погрешности вычислений тоже делятся на абсолютные и относительные.
И точно так же, как в метрологии, нам известно число содержащее погрешность, но неизвестно точное значение и точная величина ошибки. Поэтому вводится понятие предельной абсолютной погрешности как предела сверху для различных значений погрешности числового значения.
Например, мы можем вычислить значение синуса в пределах углов от 0 до 90 градусов с некоторым шагом и получим набор числовых значений. Найдем абсолютное значение погрешности вычисления вычитанием наших значений из "эталонных" (считающихся точными). В результате, у нас будет набор абсолютных погрешностей, причем из значения будут разными для разных точек. Найдем в этом наборе максимальное, по модулю, значение погрешности. Это и будет предельное значение абсолютной погрешности для нашего метода вычисления.
Точно так же мы можем найти значения относительных погрешностей. И эти погрешности будут ограничены сверху предельной относительной погрешностью. Здесь нет ничего необычного.
А теперь давайте разберемся с очень важными понятиями значимых цифр и верных значимых цифр чисел. Не смотря на то, что и здесь все очень похоже на метрологию, нужно выделить важные именно для вычислений и представления чисел нюансы.
Значащей цифрой приближенного числа называется всякая цифра в его изображении, отличная от ноля, и ноль, если он содержится между значащими цифрами или является представителем сохраненного разряда.
Это определение может показаться запутанным, но все очень просто. Пусть у нас есть число
123.456789014620
не суть важно, записали мы его или получили в результате вычислений. В этом числе есть цифры ноль. Должны ли мы считать их значащими? В общем и целом, да. Но какой ноль будет не значащим? Давайте посмотрим на тоже самое число, но записанное немного по иному
000123.456789014620
Первые три ноля не будут являться значащими. Незначащие ноли часто не выводятся на экраны цифровых измерительных приборов.
Что такое сохраненные разряды? Предположим, нам нужно обеспечить точность до 7 знака после запятой. Таким образом, наше число можно записать так
123.4567890 (14620)
В скобках через пробел я написал цифры, которые отбрасываются в нашем представлении числа. Они "лишние" и не являются значащими. Остальные цифры мы сохранили в представлении числа. Это и есть сохраненные разряды. Они соответствуют значащим цифрам (разрядам). И не важно, идет речь о десятичных разрядах, как в нашем примере, или о двоичных, как в представлении чисел в ЭВМ.
Внимательные читатели уже заметили, что значащие цифры (разряды) в точности соответствуют тому, что мы ранее называли разрешающей способностью в представлении чисел. И это действительно так. Для действительных чисел в экспоненциальной форме записи, которая соответствует представлению чисел в формате с плавающей запятой в ЭВМ, количество значащих цифр определяется разрядностью мантиссы.
Влияние разрядности мантиссы мы уже рассматривали ранее, поэтому повторяться не будем. Но мы уже знаем, что погрешность чисел и вычислений определяется отнюдь не только, и даже не столько, разрядностью. Поэтому нам нужно отделять значащие цифры от верных значащих цифр.
Значащая цифра, входящая в запись приближенного значения некоторой величины называется верной, если абсолютная погрешность значения не превосходит единицы (половины единицы) разряда, соответствующего этой цифре.
И опять, все на самом деле проще, чем кажется при прочтении определения. Предположим, у нас есть число и предельное значение абсолютной погрешности для него. Например
123.456780735412±0.00002
Вполне возможно, что это число получено в результате вычислений для исходных данных с погрешностями или с использованием не точной математической модели. Давайте по прежнему будем считать, что у нас значащими являются 7 цифр после запятой. Значит, нам нужно отбросить лишние цифры. В результате получим
123.4567807 (35412) ±0.00002
Значение абсолютной погрешности 2 единицы пятого разряда после запятой. Это больше половины единицы данного разряда. Значит, в нашем числе верными будет только 4 цифры после запятой. Не смотря на то, что мы записали 7 цифр.
Это наглядно демонстрирует то, что разрешающая способность, определяемая количеством разрядов в числе (мантиссе), не тождественно точности соответствующего данному числу значения. Это важно понимать.
В нашем случае, было бы правильным записать число в виде
123.4568000
где все цифры после запятой не только значащие, но и верные.
Еще раз отмечу, что увеличение разрядности числа не даст никакого результата, если точность значения ограничена верными цифрами, причем количество верных цифр (разрядов) меньше общего количества цифр (разрядов) в числе. Просто последние цифры, даже отличные от нуля, не имеют смысла. Это очень важно понимать.
Работа с неточными числами и вычислениями
Вот теперь мы можем посмотреть, что происходит с погрешностями двух чисел при выполнении с ними арифметических операций. Я буду сразу приводить готовые результаты, без выводов и обоснований. Подробности, кому это интересно, могут найти в курсах вычислительной математики или численных методов.
- При сложении неточных чисел абсолютная погрешность суммы равна сумме абсолютных погрешностей слагаемых. Относительная погрешность при сложении не возрастает.
- При вычитании неточных чисел абсолютная погрешность разности будет равна сумме абсолютных погрешностей чисел. Относительная погрешность разности, определяемая как отношение суммы абсолютных погрешностей к разности чисел, может оказаться значительно больше относительной погрешности исходных чисел. Это произойдет, если вычитаются близки по значению числа. При этом знаменатель дроби может оказаться меньше 1, что и приведет к резкому росту относительной погрешности. Это важный нюанс!
- При умножении и делении относительная погрешность результата равна сумме относительных погрешностей исходных чисел.
Такой учет погрешностей называется аналитическим. Он ориентирован на худший случай, как и арифметическое суммирование погрешностей в метрологии. При большом объеме вычислений становится возможным применять не аналитическую, а статистическую оценку погрешностей. Точно так же, как мы делали в метрологии с оценкой погрешностей независимых величин.
Заключение
Сегодняшняя статья больше является чисто описательной, чем строгой с точки зрения математики или метрологии. Такая научно-популярная беллетристика. При этом затронутые вопросы являются действительно важными для тех, кто занимается вычислительными задачами или разрабатывает измерительные приборы, которые используют косвенные измерения с множеством вычислений.
Вместе с предыдущей статьей и некоторыми статьями из цикла "Нескучная метрология" я постарался хоть как то показать, что не разрядностью единой определяется точность получаемых результатов. Что работа с результатами измерений, с приближенными числами, с неточными математическими моделями, гораздо интереснее и шире, чем простой учет погрешностей. Что нет ничего второстепенного. Что надо учитывать множество деталей, которые важны для достижения результата. Что нельзя выдергивать лишь отдельные факты или умозаключения из большого целого.
Это то, что так и отказывается признавать мой оппонент Николай. Только теперь он говорит об этом через посредника.
Ну а выводы... Выводы делать вам, уважаемые читатели.