Гурский Д., Турбина Е. - Вычисления в MathCad 12 (1077322), страница 17
Текст из файла (страница 17)
Если число не очень большое и не оченьмаленькое (по абсолютному значению), то на то, чтобы описать его степень, требуетсягораздо меньше, чем 11 бит. Поэтому часть бит можно отдать под мантиссу. Так какв 99 % случаев приходиться работать именно со средними числами, то не будет преступлением декларировать точность в 17 знаков мантиссы. Это не будет соблюдатьсялишь, если показатель степени окажется больше (по абсолютному значению) 20. Приэтом точность снизится до 15-16 знаков.Итак, точность представления чисел обычно составляет 17 знаков мантиссы.
Еслив мантиссе больше знаков, то произойдет округление:1.99999999999999999=2Если целое число образовано более чем 17 цифрами, то также производится округление до 17 значащих разрядов. Мантисса при этом будет записана в виде десятичнойдроби, и у числа появится порядок:663663783838383883838388383883838746466010183783377393834443== 3.636637838383 8391x1062Обратите внимание на то, что мантисса соответствует исходному числу лишь до 15 знака. Это, вероятно, связано с тем, что в случае такого большого порядка на мантиссувыделяется лишь 53 бита.Аналогичным образом преобразуются и дробные числа:0.0000000000067899467876544443487745= 6.7899467876544444x10" ПТо, что на хранение показателя степени числа с плавающей точкой выделяется ограниченное количество бит, означает, что невозможно работать с очень большими илиочень малыми значениями.
Максимальное число, которое может участвовать в вычислениях, называется машинной бесконечностью. Определить его, даже не прибегаяк справочникам, очень просто. Исходя из описанных принципов представления чиселс плавающей точкой очевидно, что оно должно иметь максимально возможную мантиссу, умноженную на максимально возможную степень. В двоичном представлении этобудет число, действительная часть которого образована 53 единицами, а порядок равен 2 в степени 971. Попробуем определить десятичное значение этого числа:52mantissa := "S^ 2i=stepen := 2°308mantissa-stepen = 1.798x102.3. Проведение расчета численно *69Полученная величина и является приблизительным значением искомой машиннойбесконечности.
Если при расчете системой будет получено значение, большее машинной бесконечности, то она не сможет разместить его в отведенных на число 64 битах.Соответственно при этом возникнет сбой, и будет возвращено сообщение об ошибке(рис. 2.4).mantissa- step en- |_Л = • iFound a number with a magnitude greater than 10Л307while trying to evaluate this expression,Рис.
2.4. Сообщение гласит: «При попытке вычислить это выражение найдено числосо степенью, большей чем 10"307»Ограничение имеется не только на положительное значение показателя степени числас плавающей точкой, но и на отрицательное. Это означает, что существует число, всечисла меньше которого воспринимаются как 0. Это число называется машинным ну1074324лем, и равно оно 1х2" » 4.94065645841247х10 .В Mathcad по умолчанию до нуля округляются числа, по модулю меньшие 10 15. Отчего так происходит, если лимит машинного нуля дает возможность оперировать кудаменьшими значениями? Все дело в погрешности расчетов, предельная точность которых, ввиду ограничений на длину мантиссы числа, составляет, в зависимости от величины числа, 15-17 значимых цифр. Округление до 10~15 ее сглаживает, в результатечего неудобные и некрасивые ответы появляются реже.
Например, если снизить порог20нуля до 10~ , то при вычислении синуса п мы получим следующий результат:sin(n)= 1.2246063538223773x10" 16В рамках погрешности численных расчетов ответ был получен верно. Однако для человека, далекого от мира компьютеров, но знающего, что sin(n)=0, он неправилен. Что15бы отсечь погрешность, порог нуля должен составлять 10" :sin (л) = ОЧаще всего снижать порог нуля нет никакого смысла. Ответы от этого точнее не станут, а погрешность проявится. Это стоит сделать лишь в том случае, если в рамках решаемой задачи вам придется проводить арифметические расчеты с очень малыми величинами (функции от таких значений обычно корректно не вычисляются). Для этогооткройте вкладку Tolerance (Точность) окна Result Format (Формат результата) (открывается командой Result меню Format).
На этой вкладке найдите окошко Zero threshold(Порог нуля). По умолчанию в него введено значение 15. Его вы можете заменить любым другим числом от 0 до 307 (при этом ни одна формула не должна быть выделена).Приведем несколько примеров расчетов при минимальном пороге нуля:10"34590-97= 1.238x10- 97. /,„-100\ , ,„-100sin(l0-100)=lxl0-10°-167 ,,„„ ,„-73е " 1 6 7 = 2.97x10"Все числа в Mathcad рассматриваются как комплексные. И соответственно практически все математические операции рассчитаны на такой тип числа.
Поэтому, помимоошибки в действительной части, нужно учитывать и погрешность мнимой составляющей результата. Весьма характерна ситуация, когда, например, при численном определении корня нелинейного уравнения ответ, который, исходя из графика, должен быть70•:• Глава 2. Вычисления и типы данныхдействительным числом, выдается с небольшой мнимой частью. Ее появление — результат погрешности вычислений, и, естественно, ее присутствие в ответе делает егоматематически некорректным. Чтобы избавиться от такой случайной мнимой части,следует уменьшить величину порога нуля для комплексных чисел Complex thresholdрассматриваемой вкладки. По умолчанию данный параметр равен 10, что на пять порядков меньше порога нуля для действительных чисел.
Это означает, что в том случае,если отношение действительной части к мнимой превысит 1010, в качестве ответа будет отображена только действительная. И, наоборот, если это отношение окажетсяменьшим по модулю, чем 10~10, на лист будет выведена только мнимая часть. Максимальное значение Complex threshold также меньше, чем Zero threshold, и составляет 63.Примеры округления комплексных чисел:1010~10+10-i=10i10+ 10~ -i = 10Если не знать особенностей представления чисел на компьютере, то возможны оченьинтересные «сюрпризы». Например, попробуем вычислить значения двух алгебраически идентичных выражений и посмотрим, совпадут ли результаты:g(x) := х-f(x) :=f(5000)-g(5000)= 4.121x10Пf(500000)-g(500000)= 3.726x109Результаты расчетов по двум идентичным формулам различаются, пусть и незначительно.
А это означает, что если бы мы пытались установить факт равенства этих выражений, то вывод был бы сделан неверно.Причиной появления ошибок, подобных описанной, является то, что числа сохраняются с ограниченной точностью. Конечно, 15-17 знаков мантиссы — это более нежелидостаточно для большинства расчетов. Но в некоторых случаях ошибки округленияспособны накапливаться, искажая результат весьма значительно. Например, в следующем примере показано, что путь, которым осуществляется вычисление, в случае численных расчетов влияет на результат (что связано с разной погрешностью разных операций):1000000V0.00001234=12.3399999997527п= 10.000012341000000 = 12.3400000000000Даже более значительные ошибки, чем при суммировании и умножении, возникаютпри проведении таких арифметических операций, как деление и, особенно, извлечение корня.
Кстати, чем ближе число, с которым проводится та или иная арифметическая операция, к крайним значениям численного промежутка, значениями в пределах которого может оперировать компьютер, тем относительная ошибка вычисленийвыше.То, что число я хранится с точностью лишь до 17-го знака, является одной из причинпогрешности, возникающей при вычислении значений тригонометрических функций.Обычно эта погрешность незаметна, однако она проявляется при определении значения функций вблизи нулей и разрывов (особенно, когда я предшествует большой множитель):—sin(l 0000л) =-4.856x10tanl --lOOOlUl.OnxlO2.3. Проведение расчета численно * 7 113cosf -lOOOOl] = 1.954x10121()cot(rc-10 )=-4.466xl0П5Из приведенных примеров можно сделать вывод, что в подавляющем большинствеслучаев уровень доверия к численному результату не может включать все 15-17 цифрмантиссы. Однако и ниже 10-го знака точность опускается редко.
Поэтому наиболеекорректным будет использовать округленные ответы приблизительно таких порядков(впрочем, используемые на практике значения чаще всего округляются до 3-го знака —при этом все вычислительные ошибки Mathcad становятся практически незаметными). Если же вас интересует результат предельно высокой точности, для проведениявычислений нужно использовать не численный, а символьный расчет. Если же расчетможно осуществить только численно, то сгладить погрешности можно, уменьшив порог нуля (впрочем, данный подход применим далеко не всегда).Иногда при расчетах возникает ситуация деления на нуль. При численных расчетахоперировать понятием «бесконечность» невозможно, поэтому система выдаст сообщение об ошибке.
Чтобы оперировать выражениями, в которые входит бесконечность(или при вычислении которых бесконечность получается), расчет следует проводитьсимвольно.Самой большой странностью численной арифметики в Mathcad является то, что приделении 0 на 0 в результате получается 0:оад:то0хТо, что 0/0 не равно какому-то конечному числу — это аксиома. Если же признать, чтоО можно разделить на 0, то можно будет с легкостью доказать, например, что 1 равно 2(попробуйте это сделать). Трудно сказать, что заставило разработчиков ввести в систему столь необычную особенность, но помнить о ней нужно, так как она может статьпричиной трудноуловимой ошибки.