8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

0 ... 15 16 17 18 19 20 21 ... 177

Пример 2.9. Расчет численного значения функции в нескольких точках

2 , 2 „ х -fy fix, у) :=-J-

*-У

f(5,6)=-61 гТД5) = 611X3.7) = -14.5 rt67,9Q =-454.613

По умолчанию отображается лишь четыре знака мантиссы числа. Как увеличить количество отображаемых знаков, рассказывается в подраад. 2.3.4.

Точность численного расчета в Mathcad ограничена 17 знаками после запятой. Поэтому, если в ходе расчета будет получено число, меньшее 10"", оно будет округлено до нуля. Верхняя граница при численных расчетах равна машинной бесконечности: 10м7. Чтобы разобраться в природе данных ограничений, внимательно прочитайте следующий подраздел.

2.3.2. Особенности представления чисел и проведения арифметических расчетов

При проведении расчетов численно (в отличие от символьных расчетов) Mathcad использует аппаратно реализованные арифметические инструменты самого компьютера, оперируя 64-битными числами с плавающей точкой, Именно отсюда проистекают все особенности и недостатки численных расчетов, которые на первый взгляд могут показаться следствием несовершенства самой программы.

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

Точность вычислений определяется тем, сколько памяти выделяется на хранение каждого числа. На современных компьютерах используется 64-битный формат двойной точности (соответственно формат одинарной точности — 32-битный). Это позволяет напрямую закодировать 261=18446 744 073 709551 616 целых чисел. Совсем немного, не правда ли? На практике приходится работать куда с большим количеством числовых значений. Как же «запихнуть» в скромные 64 бита все необходимые числа?

Решением описанной сложности является формат представления чисел с использованием плавающей точки. Основная его идея заключается в следующем. Число разделяется на две части — значащую часть (мантиссу) и степень. Например, число 123 можно записать, как 1.23x10*. число 123000- как 1.23x10*, число 0.123 - как 1.23x10-. При этом возможное число вариантов для передаваемых 64 битами чисел резко возрастает. Правда, точность представления чисел от этого не повышается — она всегда равна номеру последнего знака мантиссы. Но так как нас практически всегда интересуют результаты ограниченной точности (чаще все га. всего лишь до третьего знака после запятой), то модель чисел с плавающей точкой вполне приемлема.

В общем случае число имеет форму sxmx2*, где s — знак числа (1 бит), m — целое число, определяющее мантиссу (в процессорах Pentium под него отведено 52 бита),


е — показатель степени (обычно 10 бит). Проанализируем приведенные цифры. Если значимая часть числа может определяться 53 двоичными разрядами, то количество его десятичных разрядов не может превышать 53xJg(2)»l5. Это означает, что точность вычислений ограничена 15 действительными знаками. Так и было во всех версиях Mathcad вплоть до 12. В12 версии, вероятно, в связи с переходом на технологию .NET, длина мантиссы чисел увеличилась до 17 знаков. Это означает, что под мантиссу сейчас выделяется 55-56 бит. На показатель степени, как и раньше, выделяется 11 бит (это легко установить по значению максимального представимогочисла). Итого получается 67-68 бит на число. Но как это возможно, если на аппаратном уровне под число с плавающей точкой выделяется всего 64 бита? Вероятно, среда Net Framework, в которой исполняется Mathcad, выделяет под мантиссу разное количество бит в зависимости от величины представляемого числа. Если число не очень большое и не очень маленькое (по абсолютному значению), то на то, чтобы описать его степень, требуется горазда меньше, чем 11 бит. Поэтому часть бит можно отдать под мантиссу. Так как в 99 % случаев приходиться работать именно со средними числами, то не будет преступлением декларировать точность в 17 знаков мантиссы. Это не будет соблюдаться лишь, если показатель степени окажется больше (по абсолютному значению) 20. При этом точность снизится до 15-16 знаков.

Итак, точность представления чисел обычно составляет 17 знаков мантиссы. Вели в мантиссе больше знаков, то произойдет округление:

Если целое число образовано более чем 17 цифрами, то также производится округление до 17 значащих разрядов. Мантисса при этом будет записана в виде десятичной дроби, и у числа появится порядок:

Обратите внимание на то, что мантисса соответствует исходному числу л ишь до 15 знака. Это, вероятно, связано с тем, что в случае такого большого порядка На мантиссу выделяется лишь 53 бита.

Аналогичным образом преобразуются и дробные числа:

0.0000000000067899467876544443487745 = 6.7899467876544444x10" 12 То, что на хранение показателя степени числа с плавающей точкой выделяется ограниченное количество бит, означает, что невозможно работать с очень большими или очень малыми значениями. Максимальное число, которое может участвовать в вычислениях, называется машинной бесконечностью. Определить его, даже не прибегая к справочникам, очень просто. Исходя из описанных принципов представления чисел с плавающей точкой очевидно, что оно должно иметь максимально возможную мантиссу, умноженную на максимально возможную степень. В двоичном представлении это будет число, действительная часть которого образована 53 единицами, а порядок равен 2 в степени 971. Попробуем определить десятичное значение этого числа:

1.99999999999999999=2

663663783838383883838388383883838746466010183783377393834443=

= 3.6366378383838391x10

52

stepen :=2

i = 0


Полученная величина и является приблизительным значением искомой машинной бесконечности. Если при расчете системой будет получено значение, большее машинной бесконечности, то она не сможет разместить его в отведенных на число 64 битах. Соответственно при этом возникнет сбой, и будет возвращено сообщение об ошибке (рис 2.4).

manbses ttsptn) 1 - 11

Fouid в mjribw «<ith a magnitude greater tfwi ШЛ30? while trying tc gvbate ttl$ e»presitan,

Рис. 2.4. Сообщение гласит: «При попытке вычислить это выражение найдено число оо степенью, большей чем КГ307.

Ограничение имеется не только на положительное значение показателя степени числа с плавающей точкой, но и на отрицательное. Это означает, что существует число, все числа меньше Которого воспринимаются как 0. Это число называется машинным нулем, н равно оно 1x2 - 4.94065645841247х1()-зм.

В Mathcad по умолчанию до нуля округляются числа, по модулю меньшие 10"IS. Отчего так происходит, если лимит машинного куля дает возможность оперировать куда меньшими значениями? Все дело в погрешности расчетов, предельная точность которых, ввиду ограничений на длину мантиссы числа, составляет, в зависимости от величины числа, 15-17 значимых цифр. Округление до 10~1* ее сглаживает, в результате чего неудобные и некрасмаые ответы появляются реже. Например, если снизить порог нуля до 10~ю, то при вычислении синуса я мы получим следующий результат

rin(n)» 12246063538223773x10" 16

В рамках погрешности численных расчетов ответ был получен верно. Однако для человека, далекого от мира компьютеров, но знающего, что sin(n)-K), он неправилен. Чтобы отсечь погрешность, порог нуля должен составлять Юг1*:

sin (я) = 0

Чаще всего снижать порог нуля ист никакого смысла. Ответы от этого точнее не станут, а погрешность проявится. Это стоит сделать лишь в том случае, если в рамках решаемой задачи вам придется проводить арифметические расчеты с очень малыми величинами (функции от таких значений обычно корректно не вычисляются). Для этого откройте вкладку Tolerance (Точность) окна Result Format (Формат результата) (открывается командой Result меню Format). На этой вкладке найдите окошко Zero threshold (Порог нуля). По умолчанию в него введено значение 15. Его вы можете заменить любым Другим числом от 0 до 307 (при этом ни одна формула не должна быть выделена). Приведем несколько примеров расчетов при минимальном пороге нуля:

Ю"34 . , ,Л-97 /„-100Л ..„- 100 -167 -73

590

(ю-,00)=

= 1.238x10 " sindO1x10 "~ с " = 2.97x10

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



0 ... 15 16 17 18 19 20 21 ... 177