Форсайт Дж., Малькольм М., Моулер К. - Машинные методы математических вычислений (1040536), страница 7
Текст из файла (страница 7)
Этот последний способ учета ошибок округления называется обратным анализом; он был в большой степени разработан Дж. Уилкинсоном. Говоря общо, такой подход характеризуется следующим вопросом: насколько малые изменения в исходных данных задачи необходимы для того, чтобы представить вычисленные результаты как точное решение возмущенной задачи. В более классическом подходе к ошибкам округления в прямом анализе выясняется просто, насколько ошибочны полученные УПРАЖНЕНИЯ 37 ответы в качестве решения задачи с ее собственными исходными данными. Хотя оба метода полезны, важной осдбенностьюточкн зрения обратного анализа является то, что он позволяет анализировать ошибки округления больших матричных или полииомиальных задач, поскольку допускает использование ассоциативных операций, что часто очень затруднительно в прямом анализе ошибок.
Несмотря на элементарный характер квадратного уравнения, можно с большой долей уверенности сказать, что (по крайней мере на момент написания этой книги) во всем мире имелось не более пяти машинных программ, удовлетворяющих намеченным выше критериям, Создание такого алгоритма не является очень глубокой задачей, но все же оно требует ясного осознания цели и внимания к деталям при достижении этой цели.
Вот сорт задач, где младшекурсник математического или вычислительного факультета может внести существенный вклад в машинные биб. лиотеки программ. упр анги%ни% 2.1. Ряд Тейлора для функции ошибок имеет вид М 2 тс ~ ( 1)чхзьет Рсн Лм л1 (2п+1) Этот ряд сходится для всех х. Напишите программу для вычисления ег1(х) посредством этого ряда.
Возьмите членов ряда ровно столько, чтобы первый отброшенный член не менял накопленной суммы, будучк добавлен к ней в плавающей арифметике. Так как ряд знакопеременный, то ошибка от его обрывания будет в этом случае меньше единственной ошибки округления. Исследуй. те влияние ошибок округления, сравнивая вычисленную сумму со значением, взятым из таблицы ег1(х), нли зваченнем, полученным по надежной программе. Попробуйте х=о.б, 1.0, Ь.О и 10.0. Объясните ваши результаты. Указание: внутренний цикл вашей программы может быть таким: 10 01.(зй ~ 3 ЕМ = Ег( + 1.
Т = -ХЯСэтэ(2,эЕК-1.)/(ЕР(э(2лЕМ+1.)) Бр Е+Т 1г (О(лзз.)ЧЕ, $) СО ТО 10 Какие значении должны быть присвоены переменным Т, В, ЕМ, ХВС перед входом в этот цикл) Не забудьте множитель 21)' й 2.2. Какой результат будет получен, если пропустить на вашей машине следующую программу? Объясните, почему, 2.
ВЫЧИСЛЕНИЯ С ПЛАВАЮЩЕЙ ТОЧКОЙ Х = О.О Н=0.1 РО 10 1 = 1, 1О Х=Х+Н 1О СОНТ1ЫЫЕ У =- 1.0 — Х %К!ТЕ(6,20) Х, У 20 ЕОЙМАТ(2Е20.10) 8ТОР ЕН!2 2.3. Будет ли десятичное число О.! точно представимо в вашей машине? Если нет, то какова ближайшее к нему число с плавающей точкой? Каково ближайшее числа с плавающей точкой среди чисел, меньших О.!? Кзкие зна. чения присваиваются каждому из следующих операторов? ЙЕАЬ Х Х?0()ВЬЕ РКЕС!5!О)Ч У Х=О.! У=О.! У = 0.!ПО Х = 1.0!10.0 У = 1.0)?0/10.0()0 Х = 1.ОЕ' ! У = 1.0() — 1 ЙЕАР(5,10) Х, У 1О РОКМАТ(Е5.1, (?5.1) Данные: ол од 2.4. а) Будет ли число а=3!4 159 265 358 точно представимо в вашей машине 1) как целое число, 2) кан число с плавающей точкой обычной точности 3) как число с плавающей точкой двойной точности? б] Какова ближайшее к з число с плавающей точкой обыкновенной точности? Какое значение хранится на самом деле в различных системах программирования, когда действительной переменной присваивается значение г? в) Каково ближайшее к з число с плавающей точкой двойной точности? Какое значение хранится на самом деле в различных системах программирования, когда переменной с двойной точностью присваивается значение г? г) Найдите косинус угла в 314 159 265 358 радиан с ошибкой, не превосходящей 1О д) Что произойдет, если вы станете вычислять соз (3.14159265358е10п) в различных системах программирования? 2,5.
(Кахан) а) Как представляются во внутреннем коде вашей машины числа г,'з, з/з н з/з? Испольауйте соответствующую запись, т. е, двоичную, восьмеричную, шестнадцатиричную, и т, д. Как представляются зги числа в плавающих системах других машин, таких, как 1ВМ 360, С()С 6600, ()п)час 1108, Нопеуч~е!1 6000, Р()Р-!1, Вцггоцййз 6500 н т. д.? б) Прочтите следующую фортран-программу: упрлжннния ЗЗ . Н =122. Х гуз.
— Н У=325.— Н Е = (Х+Х+Х> — Н Р (У+У+У+У+У) Н О =Р)Е ЪЧК1 ТЕ (6,10) () ЗТОР 10 РОКМАТ(! Н, С2020) ЕХО Переменная 9 может получить несколько различных значений в зависимости от аппаратной реализации плавающей арифметики на той или иной машине. Попробуйте предугадать значение () для тех машин, с которыми вам приходилось иметь дело. Пропуститс программу на сточьких машинах, на скольких сможете, чтобы проверить свои предсказания. Объясните ваши результаты.
2.6. Прочтите две следующие фортран-программы: ЕРЗ = 1. 10 ЕРЗ = ЕРБ/2. У?К!ТЕ (6,20) ЕРЗ 20 РОКМАТ (1Н, 020.10) ЕРЗР1 = ЕРБ + 1 1Р (ЕРЗР1 .СТ. 1.) СО ТО 1О БТОР ЕХЮ ЕРЗ = 1, КО ЕРБ = ЕРБ!2, %К!ТЕ (6,20) ЕРЗ 20 РОКМАТ (1Н, С20.10) 1Р (ЕРЗ,СТ. 0.) СО ТО 10 ЗТОР ЕХ(У Пропустите эти программы в вашей системе н объясните результаты. 2.7. Каков результат будет получен, если следующую фортран-программу пропустить на различных машинах, с которыми вы знакомы? Попробуйте предсказать ответ до выполнения программы; после выполнения сверьте с вашим предсказанием. Каков будет эффект от включения описания 000ВЕЕ РКЕС1Б10(ч ЕРЗ, ЕРБР! в заголовок программы? 3.
ВЫЧИСЛЕНИЯ С ПЛАВАЮЩЕЙ ТОЧКОЙ 40 ЕРВ = 1. кв)т=о 10 Ерв = .5ьЕРЗ кв(т = кв(т+1 ЕРВР1 = ЕРВ+1. 1Е ((ЕРЗР1.ОТ.1.).АНО.(ЕРЗР! -ЕРВ,ЕО.1.)) ОО ТО 10 1Г (ЕР$Р1-ЕРВ.ЕОЗ.) ЕРБ = 2.ьврй %В1ТЕ (6,20) ЕРЗ, КВ1Т ВТОР 20 РОВМАТ(1Н,О20.!О,ПО) ЕНЭ 2.8. Рассмотрим трехзначную десятичиу1о плзвающуш сИСтечу Р с усечением '), числа которой имеют вид « = ~ . б,дада Х 10, где — 100-.-ам=100 и Ощз(г(9.
Пусть г" нормализоаана (т. е. птФО для хФО). Число нуль содержитса в г" и имеет единственное представление +.000Х Х10 Посредством знака Я будем обозначать операцию плавающего сложения. для всех х и д из г" значение х(Тщд опрсделяетси как чисто с плавающей точкой, ближайшее к х-', д среди чисел с плавающей точкой, ие превосходящих по модулю к+д. Знак 8 будет обозначать операцию плавающего умножения. Если х и д принадлежат Е, то значение х®д определяется как число с плавающей точкой, ближайшее к хХд среди чисел с плавающей точкой, не превосходящих по модулю ххд, а) Сколько различных действительных чисел могут быть точно представлены в д) б) Найдите примеры чисел х, д, г из г", показывающие, что нижеследующие равенства, вообще говоря, неверны, даже если результат находится а границах множества г: (1) (х ® д) (2) г = х Е (д(х) г), (2) (хЯд)ф-г=х~~(дЯг). в) Найдите пример, в котором сумма (хЯд)((эг имеет относительную ошибку по меньшей мере 50зз.
2.9. Напишите подпрограмму П(ИВЕ (Е, Г, А, В, С, П) в арифметике с двойной точностью; входом подпрогралшы являются 4 числа с двойной точностью и, Ь, с, г(, а выходом — два числа с двойной точностью е и А такие, что а+ (Ь е+11 = —. с+И ' где !а= — 1. Возможно, вы захотите вилючить н подпрограмму что-нибудь аро. де параметра ошибки на случай, если знаменатель окажется равен нулю. Постарайтесь предусмотреть вероятные переполнения и машинные нули и, насколько сумеете, избежать их. (Например, не начинайте с вычисления се+ба и удостоверьтесь, что ваша подпрограмма выдержит предложенный ниже тестовый пример). Обойти асс возможные опасности — задача слишком трудная для не очень искушенного читателя, но вы должны уметь объяснить остающиеся слабые места в вашей программе.
т) В оригинале — спорреб. — Прим. перса. УПРАЖНЕНИЯ 41 а) Проверьте вашу подпрограмму вызовом САУЛ. 011'!ВЕ (Е, Г, 1.234(738, 2.345()37, 9.876()37, — 5.565036). б) Для сравнения вычислите то же частное посредством встроенной подпрограммы ФОРТРАНа для делении комплексных чисел с двойной точностью. если таковая имеется на вашей машиче. 2.10. Напишите подпрограмму 5ОКООТ(Е, Р, А, В), которая использует действительную арифметику с двойной точностью и вычисляет один комплексный квадратный корень г+»7= )г а+Б, скажем тот, для которого е)0, а если г=О, то )>О.