Команды арифметики с плавающей точкой

{toc_noshowall}Теперь мы знаем, как выполняются арифметические операции над числами, представленными в виде с плавающей точкой. Ниже перечисляются команды арифметики с плавающей точкой и даются краткие комментарии, касающиеся их использования.

Мнемоники команд с плавающей точкой тесно связаны с названиями соответствующих операций. Фактически мы имеем те же самые основные операции:

Операция

Мнемоника

 

Загрузка (Load)

L

Запись в память (STore) 

ST

Сложение (Add)

А

Вычитание (Subtract)     

S

Умножение (Multiply)     

M

Деление (Divide)               

D

Сравнение (Compare)     

C

Загрузка положительная (Load Positive)               

LP

Загрузкаотрицательная(Load Negative)             

LN

Загрузка дополнения (Load Complement)

LC

Вводится лишь одна дополнительная операция ПОПОЛАМ (Halve — Н), позволяющая выполнять деление на 2. Мнемоника любой из перечисленных операций должна быть дополнена еще одной буквой, указывающей на тип операндов и необходимость нормализации результата. Операндам, имеющим короткий формат, соответствует букваЕ, длинный — D, и расширенный — X. Если мы не хотим нормализовать результат при выполнении сложения или вычитания, то вместоЕ надо написать U, а вместо D — W. Наконец, командам формата RR соответствует мнемоника, оканчивающаяся на R. Например, по команде LPER содержимое одного из регистров с плавающей точкой заменяется его абсолютной величиной. AW соответствует команде вычисления ненормализованной суммы двух чисел с плавающей точкой длинного формата, одно из которых находится в памяти.

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

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

Сокращение FPR в данном случае обозначает регистр с плавающей точкой. Стоящая после комбинации этого сокращения цифра указывает номер соответствующего операнда. Не забывайте, что все регистры, выступающие в качестве операндов команд арифметики с плавающей точкой, должны быть четными, длинные константы на самом деле записываются в пару регистров каждая. Тип операндов указывается следующим образом: отсутствие подстрочных символов означает, что команда оперирует с короткими константами, подстрочный символ D — что с длинными константами, подстрочный символ X — что с расширенными константами. (D2+(X2)+(B2))d означает содержимое двойного слова, расположенного в памяти по адресу D2+(X2)+(B2). Обозначение (FPR2)x определяет содержимое четырех регистров. В качестве второго операнда в этом случае выступают регистры с номерами FPR2, FPR2+1, FPR2+2 и FPR2+3.

При выполнении команд обработки коротких чисел содержимое нечетных регистров не меняется. Например, по команде

LER  4,6

содержимое регистра 6 помещается в регистр 4, содержимое регистра 5 при этом не меняется. По команде

LD '   0,DNUM(7)

двойное слово, находящееся по адресу DNUM, индексированному содержимым регистра 7, помещается в регистры с плавающей точкой 0 и 1. Если после этого выполнится команда

LE 0.SINGNUM

то полное слово SINGNUM попадет в регистр 0, а содержимое регистра 1 при этом не изменится.

Существуют две команды записи в память:

STE FPR 1 ,D2(X2,B2)

 STore single-precision

(FPR1)?D2+(X2) + (B2)

STD FPR 1 ,D2(X2,B2)

SToreDouble-precision

(FPR1)?D2+(X2)+(B2)

Они различаются лишь типом операндов. Команда STE используется для записи в память коротких чисел, STO — для записи длинных. Команды загрузки и записи в память не меняют признака, результата.

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

Результат и LCDR меняют его на противоположный, LNER и LNDR — устанавливают в знаковый разряд 1, а команды LPER и LPDR —0.

Сложение и Вычитание. Операции сложения и вычитания могут выполняться с помощью восьми различных команд арифметики с плавающей точкой. Выбор конкретной команды зависит от типов операндов, их расположения и необходимости нормализации результата. Команды сложения и вычитания чисел с плавающей точкой приведены в табл. 19.1. Регистр FPR1 в любой из них играет роль накопителя, в нем первоначально находится один из операндов, по окончании выполнения операции в него помещается результат.

Значение признака результата вырабатывается в соответствии с обычными правилами:

Признак              Результат

результата

0                          Результат = 0

1                          Результат < 0

2                          Результат > 0

3                          Не встречается

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

Команды умножения, деления и команды ПОПОЛАМ. Результат, получающийся при выполнении команд умножения коротких чисел, имеет длинный формат и всегда нормализован. Он помещается в пару последовательных регистров, первый из которых указан в команде в качестве первого операнда.

ME FPR1,D2(X2,B2)

Multiply single-precision

FPRID?FPR1)?(D2 + (X2) + B2))

MER FPR1 ,FPR2

Multiply single-precision Register

FPRID? (FPR 1)?(FPR2)

MD FPR1 ,D2(X2,B2)

Multiply Double-precision

FPR1D?(FPR1)D?(D2 + (X2)+(B2))D

MDR FPR1 ,FPR2

Multiply Double-precision Register

FPR1D?(FPR1) (FPR2)D

Команды MDи MDRвычисляют длинное произведение длинных чисел.

Выполнение команд деления происходит полностью в соответствии сданным нами описанием. Снова в качестве операндов можно выбирать длинные или короткие числа, а второй операнд может располагаться как в регистре, так и в памяти.

Таблица 19.1 Команды сложения и вычитания арифметики с плавающей точкой одинарной и двойной точности

 

DE FPR1,D2(X2,B2)

Divide single- precision

FPR1?(FPRl)?(D2 + (X2) + B2))

DER FPR1.FPR2

Divide single-precision Register

FPR 1? (FPR 1)?(FPR2)

DD FPR 1,D2(X2,B2)

Divide Double-precision

FPR1D?(FPRI)D?(D2 + (X2) + (B2))D

DDR FPR1.FPR2

Divide Double-precision Register

FPR1?FPR1)D?(FPR2)D

По командам ПОПОЛАМ производится сдвиг мантиссы заданного числа на один двоичный разряд вправо. Результат нормализуется. Выполнение этой команды эквивалентно делению на 2.

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

Сравнение. Здесь снова мы встречаемся с четырьмя различными ко-мандами, выбор конкретной, из которых зависит от типа и размещения операндов.

При выполнении команд сравнения находится разность первого и второго операндов, и в зависимости от ее значения устанавливается признак результата:

Признакрезультата   

Результат

 

0

Операнд 1 = Операнд 2

1

Операнд 1 < Операнд 2

2

Операнд 1 > Операнд 2

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

Все команды обработки расширенных чисел имеют формат RR, кроме того, следует сразу же отметить, что в качестве операндов этих команд могут выступать лишь регистры 0 и 4. Команды сложения и вычитания расширенных чисел достаточно просты.

AXR FPR1.FPR2

Add eXtended-precision Register

FPRlx?(FPR l)x +(FPR2)x

SXR FPR1.FPR2

Subtract eXtended-precision Register

FPR1x?(FPRl)x —(FPR2)x

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

Как мы уже знаем, один расширенный операнд занижает столько же места, сколько два длинных. При выполнении операций над расширенными числами содержимое разрядов второго двойного слова расширенного операнда, обычно предназначенного для хранения информации о знаке и порядке длинного числа, игнорируется. Однако по окончании выполнения соответствующей команды обработки расширенных чисел содержимое данных разрядов имеет вполне определенный смысл. Знак второго двойного слова совпадает со знаком первого, характеристика же меньше характеристики получившегося результата на 14. Это отражает тот факт, что мантисса второго двойного слова располагается на 14 шестнадцатеричных разрядов дальше от шестнадцатеричной точки числа. Таким образом, результат выполнения команды обработки расширенных чисел имеет следующий вид:

                            4                          '

14 шестнадцатеричных цифр                           14 шестнадцатеричных цифр

Рассмотрим пример. Пусть содержимым регистров 0—3 является

Регистры этой группы будут выступать в качестве одного из операндов. В качестве другого операнда возьмем регистры 4—7. Пусть их содержимым является

Предположим, что выполняется команда

AXR         0,4

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

 Второе число отрицательно, поэтому для получения суммы его мантиссу следует вычесть из мантиссы первого числа. После вычитания получится

Затем происходит нормализация результата, т. е нормализация содержимого первых четырех регистров. При этом содержимое дополнительного разряда попадает в младший разряд числа, а поля знака и характеристики второго регистра заполняются в описанном выше порядке. Содержимое регистров 4—7 приводится к первоначальному виду. Итак, в конце концов, получается

рег. 0 — 3:48ECD65B 2466ЕВ5А 7B76F52F 42E8C1FB

рег. 4—7: С8936С71   22222222   77333333   55555555

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

Существуют три команды умножения, относящиеся к командам обработки расширенных чисел.

MXR FPR1.FPR2

Multiply extended-precision Register

FPR1x?(FPR1)x?(FPR2)x

MXD FPR1,D2(X2,B2)

Multiply extended-Double

FPR1x?(FPR1)D?(D2+(B2) +(X2))D

MXDR FPR1.FPR2

Multiply extended-Double Register

FPR1x?(FPRI)D?(FPR2)D

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

Команды MXD и MXDR предназначены для получения расширенного произведения длинных чисел. Переход от длинных чисел к расширенным для повышения точности последующих вычислений обычно производится именно таким образом. Заметим, что с помощью команды

MXD4,      =       D'1.0'

например, можно преобразовать длинное число, расположенное в регистрах 4 и 5 к расширенному виду. Результат будет помещен в. регистры 4—7. Сама такая операция не повышает точности представления числа, однако она обеспечивает подготовку к обработке его с помощью команд, оперирующих с расширенными числами.

При использовании машинной арифметики с плавающей точкой неизбежно встает вопрос о переводе чисел из расширенной формы в длинную и из длинной в короткую. Для этого, например, могут быть использованы уже рассмотренные нами команды записи в память и загрузки, однако такое их использование приведет к некоторой потере точности. Например, если в регистрах 2 и 3 расположено число с плавающей точкой, представленное в длинном формате, то по команде в регистр 4 будет помещена лишь первая часть исходного числа. Если содержимое регистров 2 и 3 выглядит, например, так:

рег. 2—3:            40803АС0         F683721C

то в регистр 4 попадет

рег. 4:        40803АС0

в то время как в результате округления было бы получено

40803АС1

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

Несколько уменьшить потерю точности можно, пользуясь специальными командами пересылки, относящимися к группе команд обработки расширенных чисел:

Команды LRER и LRDR предназначены для пересылки с предварительным округлением части соответственно двойного или расширенного слова в регистр FPR1. По команде LRER первая часть двойного слова, содержащего число с плавающей точкой, записанное в длинном формате, помещается в регистр FPR1. По команде LRDR аналогичная операция производится над расширенным словом: его первая половина помещается в регистры FPR1 и FPR1 + 1.

Перед непосредственным выполнением пересылки производится проверка содержимого первого разряда непересылаемой части слова. Если это содержимое равно или больше 8, то содержимое последнего разряда пересылаемой части увеличивается на 1. В предыдущем примере содержимое первого непересылаемого разряда равно F, и поэтому пересылаемая часть должна быть увеличена на 1. Таким образом, в результате выполнения команды

LRER         4,2

в регистр 4 будет помещено число 40803АС1.

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

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

Поскольку измерения производились с точностью почти до четырех значащих цифр, можно предположить (ошибка!), что значение полученной разности верно также до четвертой значащей цифры. Однако на самом деле даже первая значащая цифра, а именно 2, уже находится под сомнением. Мы получили точность меньшую, чем точность до одной значащей цифры.

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

    4068С10Е

—4068С108

равна

40000006

После нормализации получается

ЗВ600000

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

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

.22 —.04=0

Очевидно также, что это вычисление выполнено точно. Однако попытаемся подсчитать эту разность, используя машинную арифметику с плавающей точкой. Будем пользоваться коротким форматом для представления чисел. Число .2 в машинном виде выглядит как 40333333. Число .04 представляет собой периодическую дробь

.0A3D70A3070A3D7...

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

3FA3D70A

Однако при умножении двух коротких чисел .2 и .2 получается результат, представленный в длинном формате:

3FA3D706 F5C29000

Полученные результаты отличаются, начиная с шестого знака после точки.

Ошибки округления порядка 10-6 часто на практике не играют роли. Однако программист должен знать о существовании таких ошибок, приобретающих подчас довольно большое значение. Особенно они могут повлиять на логику выполнения программы. Команда сравнения, выполненная после команд, реализующих описанные выше вычисления, покажет, что .22 не равно .04. Из этого следует, что необходимо быть крайне осторожными при сравнении чисел в форме с плавающей точкой на эквивалентность. Два числа, представленные в форме с плавающей точкой, разумно считать равными, когда модуль их разности не превышает некоторого достаточно малого по абсолютной величине числа. Проверяя равенство двух чисел с плавающей точкой, А иВ, мы должны спрашивать не «Выполнено ли условие А=В?», а «Выполнено ли условие. | А—В |<.00001?».

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

Исчезновение порядка и переполнение. Наименьшим возможным значением характеристики является 00, что соответствует значению порядка, равному —6410. Если в результате выполнения арифметических операций над числами с плавающей точкой получается число, характеристика которого отрицательна, а мантисса не равна нулю, фиксируется особый случай, называемый исчезновением порядка. ЭВМ опознает это условие при выполнении нормализации результата арифметической операции. Получить исчезновение порядка можно, например, умножив некоторое маленькое число, представленное в форме с плавающей точкой, на целое. Сумма характеристик, уменьшенная на 64, будет в этом случае отрицательна.

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

Особый случай деления с плавающей точкой фиксируется при попытке деления на число с нулевой мантиссой.

Команда SPM. В главе 11 мы познакомились с частью PSW, называемой маской программы. Четыре разряда этой маски предназначены соответственно для разрешения или запрещения прерывания при возникновении следующих условий:

Разряд

Условия

36

Переполнение с фиксированной точкой

37

Деление с фиксированной точкой

38

Исчезновение порядка

39

Потеря значимости

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

В описанных ситуациях возникшие проблемы могут быть решены с помощью команды SPM (Set Program Mask — УСТАНОВИТЬ МАСКУ ПРОГРАММЫ):

SPM R1 Set Program Mask  СС, маска программы ?(R1)2-7 значением признака результата будет 1, будут разрешены прерывания при возникновении переполнения с фиксированной точкой и исчезновения порядка и будут запрещены прерывания при возникновении особого случая деления с фиксированной точкой и потери значимости.

Достаточно часто приходится составлять подпрограммы вычисления значений различных непротабулированных функций. Такими функциями могут, например, являться тригонометрические и специальные функции, а также любые другие функции, необходимость работы с которыми возникает в процессе решения конкретной задачи. Среди методов приближенного вычисления значений функций можно выделить интерполяцию с использованием таблиц, приближение с помощью ряда Тейлора, приближение вещественными функциями и приближение полиномами Чебышева. Широкое применение в связи с высокой точностью при сравнительно небольших вычислительных затратах получил метод приближений с помощью полиномов Чебышева. Однако этот метод все-таки слишком сложен для того, чтобы служить иллюстрацией применения арифметики с плавающей точкой.

Метод приближения с помощью вещественных функций состоит в приближении исходной функции, ряд Тейлора которой содержит бес-конечное количество членов, отношением полиномов конечных степеней. В качестве таких функций можно, например, рассматривать функции вида

f(x) =

где р(х) и q(x) имеют вид

В данном случае р(х) и q(x) имеют степени, равные п и d соответственно. Точность приближения с помощью таких отношений зависит от степеней, полиномов р(х) и q(x) и от значений их коэффициентов а0,..., аnи b0,..., bd.

Коэффициенты полиномов можно определить, например, исходя из требования совпадения ряда Тейлора исходной функции и полинома, получаемого в результате деления р(х) на q(x) до члена с номером d+rt+1 включительно. Определяемая из этого условия аппроксимирующая функция называется функцией Паде. Нередко оказывается, что известны лишь несколько первых коэффициентов разложения интересующей нас функции в ряд Тейлора в окрестности некоторой точки. Используя лишь значения этих коэффициентов, можно описанным выше способом построить гораздо более точное приближение, чем то, которым является усеченный ряд Тейлора. Кроме того, функции Паде дают представление об асимптотике приближаемой функции и ее особенностях.

Числа d и nхарактеризуют порядок приближения. Если степень знаменателя равна 5, а числителя 3, то мы имеем приближение порядка (5,3). В общем случае мы имеем приближение порядка (d, n).

Рассмотрим в качестве примера аппроксимируемой функции экспоненту. Разложение экспоненты в ряд Тейлора в окрестности точки x=0 выглядит следующим образом:

Приближение порядка (2,2) можно получить, решая уравнение

относительно переменных a1, а2, b0,b1 и b2. Воспроизвести необходимые детали мы предоставляем читателю. Окончательный результат имеет вид

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

Бесконечный ряд Тейлора не совпадает с частным, начиная с члена порядка x5, x5/120. Член пятого порядка частного равен x5/ 144.

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

Программа оформлена в виде подпрограммы; считается, что значение переменной х заключено между 0 и 1. Эта подпрограмма может также быть использована и для получения приближенных значений еxв случае, когда х не попадает в указанные пределы. Порядок такого еaиспользования описан в упражнении 15 в конце этой главы.

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

1.      Регистр общего назначения 1 содержит адрес начала списка параметров, даже если параметр всего один.

2.      Результат возвращается исходной программе с помощью регистра с плавающей точкой 0 или регистров 0 и 1 соответственно для коротких и длинных чисел, если результат представлен одним числом. Подпрограммы, удовлетворяющие этим двум требованиям, могут вызываться ФОРТРАН-программами или сами вызывать программы, написанные на этом языке при условии, что компиляция ФОРТРАН-программ выполнялась с помощью стандартных компиляторов фирмы IBM. Для подпрограмм, работающих с числами с плавающей точкой, не существует общепринятых соглашений относительно сохранения содержимого регистров.

Сначала программа вычисляет значения числителя и знаменателя и помещает их соответственно в регистры с плавающей точкой 0 и 4. Затем выполняется деление и полученный результат возвращается вызывающей программе.

Обратите внимание на то, как вычисляются значения полиномов, находящихся в числителе и знаменателе аппроксимирующей функции. Можно было отдельно найти значения всех термов, а затем все полученные результаты сложить. Для вычисления значения терма вида akxkоперацию умножения необходимо выполнить k раз (k—1 раз для возведения х в степень k и еще один раз для умножения на ak). Для того чтобы таким способом вычислить значение полинома достаточно большой степени N, необходимо выполнить приблизительно N2/2 операций умножения и операций сложения.

Существует, однако, и другой, более удобный способ вычисления значений полиномов, заключающийся в предварительном их преобразовании. Например, для вычисления значений полинома

8+Зх—4x2+20х3

его удобно сначала привести к виду

8+x(3+x(-4+20x))

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

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

 

1+x()

и

 

1+x(-)

В табл. 19.2 для сравнения приведены значения функции еx, полученные различными способами. Значения экспоненты вычислены в точках х=.5 и х=1. Значения, находящиеся в строке ФОРТРАН, получены с помощью стандартной процедуры ФОРТРАНа ЕХР. Значения, полученные с помощью аппроксимирующей функции Паде, оказываются более точными, чем значения, полученные по формуле Тейлора. Конечно, при этом считается, что аппроксимации по Тейлору и по Паде имеют одинаковый порядок.

Рис. 19.2. Подпрограмма вычисления аппроксимирующего отношения многочленов (аппроксимация Паде) степени 2 для функции еx.

Таблица 19.2 Сравнение вычислительных методов

 

Значения еx

x=5

x=1

Точные значения

1.6487213

2.7182818

ФОРТРАН

1.6487217

2.7182817

(2,2) Паде

1.6486473

2.7142849

Четыре члена ряда Тейлора

1.6484375

2.7083332

(3,3) Паде

1.6487213

2.7183097

Шесть членов ряда Тейлора

1.6487196

2.7180555

 

 
Статьи раздела