www.pudn.com > Fortran.zip > MBSL3.FOR, change:1995-04-01,size:1589b
FUNCTION MBSL3(N,X)
DOUBLE PRECISION MBSL3,X
DOUBLE PRECISION T,Y,P,B0,B1,Q,A(7),B(7),C(9),D(9)
DATA A/1.0,3.5156229,3.0899424,1.2067492,
* 0.2659732,0.0360768,0.0045813/
DATA B/0.5,0.87890594,0.51498869,0.15084934,
* 0.02658773,0.00301532,0.00032411/
DATA C/0.39894228,0.01328592,0.00225319,
* -0.00157565,0.00916281,-0.02057706,
* 0.02635537,-0.01647663,0.00392377/
DATA D/0.39894228,-0.03988024,-0.00362018,
* 0.00163801,-0.01031555,0.02282967,
* -0.02895312,0.01787654,-0.00420059/
IF (N.LT.0) N=-N
T=ABS(X)
IF (N.NE.1) THEN
IF (T.LT.3.75) THEN
Y=(X/3.75)*(X/3.75)
P=A(7)
DO 10 I=6,1,-1
10 P=P*Y+A(I)
ELSE
Y=3.75/T
P=C(9)
DO 20 I=8,1,-1
20 P=P*Y+C(I)
P=P*EXP(T)/SQRT(T)
END IF
END IF
IF (N.EQ.0) THEN
MBSL3=P
RETURN
END IF
Q=P
IF (T.LT.3.75) THEN
Y=(X/3.75)*(X/3.75)
P=B(7)
DO 30 I=6,1,-1
30 P=P*Y+B(I)
P=P*T
ELSE
Y=3.75/T
P=D(9)
DO 40 I=8,1,-1
40 P=P*Y+D(I)
P=P*EXP(T)/SQRT(T)
END IF
IF (X.LT.0.0) P=-P
IF (N.EQ.1) THEN
MBSL3=P
RETURN
END IF
IF (X+1.0.EQ.1.0) THEN
MBSL3=0.0
RETURN
END IF
Y=2.0/T
T=0.0
B1=1.0
B0=0.0
M=SQRT(40.0*N)
M=N+M
M=M+M
DO 50 I=M,1,-1
P=B0+I*Y*B1
B0=B1
B1=P
IF (ABS(B1).GT.1.0D+10) THEN
T=T*1.0D-10
B0=B0*1.0D-10
B1=B1*1.0D-10
END IF
IF (I.EQ.N) T=B0
50 CONTINUE
P=T*Q/B1
IF ((X.LT.0.0).AND.(MOD(N,2).EQ.1)) P=-P
MBSL3=P
RETURN
END