Вторая пачка часть 141
Альтернативный вариант вычисления функций Хан¬ке¬ля реализован в более экономичной по времени про¬це¬дуре HANX120, не требующей использования внеш¬них функ-ций, тело которой построено аналогично те¬лу функции YNX. Назначение формальных параметров такое же, что и в функции HANX12, однако в отличие от нее процедура ор-ганизована как подпрограмма, ре¬зуль¬татом работы ко¬то¬рой являются передающиеся че¬рез формальные параметры зна¬чения действительной и мнимой частей вычисляемой функции, что иногда мо¬жет оказаться более удобным. В про¬цедуре ис¬поль¬зу¬ют¬ся константы: 2С = 1.1544... и 1/? = =0.318... .
PROCEDURE HANX120 (NN , K : INTEGER;
VAR X1,RE,IM : DOUBLE);
VAR RE,IM,X,X2,A,R,B,S,D,P,T : DOUBLE;
X1 : REAL; NN,K,NNA,I,I1 : INTEGER;
BEGIN IF(X1 = 0.) THEN EXIT;
RE := 0.; IM := 0.;
NNA := ABS(NN);
X := DOUBLE(X1/2.);
X2 := X*X;
A := 1.; R := 1.;
B := 0.; S := 0.;
IF (NN <> 0) THEN
FOR I := 1 TO NNA DO
BEGIN R := R*I;
S := S+1./I;
END;
D := 0.;
IF(NN <>0) THEN
D := R/NNA;
R := 1./R;
P := EXP (NNA * LN(X2));
T := LN(X2)+1.1544313298031D0;
I := 0;
WHILE (I <=NNA) AND (B <>IM) DO
BEGIN B := IM;
RE := RE+A*R;
IM := IM+A*R*(T-S);
IF(I < NNA) THEN
IM := IM-A*D/P;
I1 := I+1;
A := A*X2/I1;
R := -R/(I1+NNA);
S := S+1./I1+1./(I1+NNA);
IF(I1.LT.NNA)D := D/(NNA-I1)
I := I1
END;
P := EXP ( NNA * LN(X));
RE := RE*P;
IM := 0.318309886184D0*IM*P;
IF(NN <>0)THEN
BEGIN RE := (-1)**NNA*RE;
IM := (-1)**NNA*IM;
END;
IF(K < 0) THEN IM := -IM;
END.
Тестирование процедур HANX12 и HANX120 на IBM PC/AT-386 показало, что их точностные ха¬рак¬те¬рис¬ти¬ки примерно одинаковы (при задаваемом в про¬це¬дуре HANX12 eps = 1e-8), но процедура HANX120 ра ¬бо¬тает не¬сколь¬ко быстрее. Pезультаты расчетов для k = 1 пр謬ве¬де-ны в табл. 5.14.
Таблица 5.14
n/x HANX12 HANX120
1/8 0.2346363-i*0.1580554 0.2346331-i*0.1580554
1/-8 -0.2346363+i*0.1580554 0
Индекс
Элементарные функции
Линейные уравнения
Нелинейные уравнения
Случайные числа