GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
sexpo.f
Go to the documentation of this file.
1 REAL function sexpo()
2C**********************************************************************C
3C C
4C C
5C (STANDARD-) E X P O N E N T I A L DISTRIBUTION C
6C C
7C C
8C**********************************************************************C
9C**********************************************************************C
10C C
11C FOR DETAILS SEE: C
12C C
13C AHRENS, J.H. AND DIETER, U. C
14C COMPUTER METHODS FOR SAMPLING FROM THE C
15C EXPONENTIAL AND NORMAL DISTRIBUTIONS. C
16C COMM. ACM, 15,10 (OCT. 1972), 873 - 882. C
17C C
18C ALL STATEMENT NUMBERS CORRESPOND TO THE STEPS OF ALGORITHM C
19C 'SA' IN THE ABOVE PAPER (SLIGHTLY MODIFIED IMPLEMENTATION) C
20C C
21C Modified by Barry W. Brown, Feb 3, 1988 to use RANF instead of C
22C SUNIF. The argument IR thus goes away. C
23C C
24C**********************************************************************C
25C
26C
27C Q(N) = SUM(ALOG(2.0)**K/K!) K=1,..,N , THE HIGHEST N
28C (HERE 8) IS DETERMINED BY Q(N)=1.0 WITHIN STANDARD PRECISION
29C
30C JJV added a Save statement for q (in Data statement)
31C .. Local Scalars ..
32 REAL a,q1,u,umin,ustar
33 INTEGER*4 i
34C ..
35C .. Local Arrays ..
36 REAL q(8)
37C ..
38C .. External Functions ..
39 REAL ranf
40 EXTERNAL ranf
41C ..
42C .. Equivalences ..
43 equivalence(q(1),q1)
44C ..
45C .. Save statement ..
46 SAVE q
47C ..
48C .. Data statements ..
49 DATA q/.6931472,.9333737,.9888778,.9984959,.9998293,.9999833,
50 + .9999986,.9999999/
51C ..
52C
53 10 a = 0.0
54 u = ranf()
55 GO TO 30
56
57 20 a = a + q1
58 30 u = u + u
59C JJV changed the following to reflect the true algorithm and
60C JJV prevent unpredictable behavior if U is initially 0.5.
61C IF (u.LE.1.0) GO TO 20
62 IF (u.LT.1.0) GO TO 20
63 40 u = u - 1.0
64 IF (u.GT.q1) GO TO 60
65 50 sexpo = a + u
66 RETURN
67
68 60 i = 1
69 ustar = ranf()
70 umin = ustar
71 70 ustar = ranf()
72 IF (ustar.LT.umin) umin = ustar
73 80 i = i + 1
74 IF (u.GT.q(i)) GO TO 70
75 90 sexpo = a + umin*q1
76 RETURN
77
78 END
real function ranf()
Definition ranf.f:2
real function sexpo()
Definition sexpo.f:2