File: fvalue.f

package info (click to toggle)
x13as 1.1-B39-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bullseye
  • size: 8,700 kB
  • sloc: fortran: 110,641; makefile: 14
file content (76 lines) | stat: -rw-r--r-- 1,860 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
**==fvalue.f    processed by SPAG 4.03F  at 09:48 on  1 Mar 1994
      DOUBLE PRECISION FUNCTION fvalue(X,M,N)
      IMPLICIT NONE
C*** Start of declarations inserted by SPAG
      DOUBLE PRECISION X
      INTEGER i,i1,j,j1,k,l,M,N
C*** End of declarations inserted by SPAG
C --- THIS FUNCTION CALCULATES F-DISTRIBUTION PROBABILITY LEVELS FOR
C ---   PR(R.V. WITH F-DISTRIBUTION WITH M AND N DEGREES OF FREEDOM > X)
      DOUBLE PRECISION w,z,p,y,d,zk
      IF(X.gt.0D0)THEN
       IF(X.le.90D0)THEN
        IF(X.le.40D0.or.N.le.150)THEN
         l=(M/2)*2-M+2
         k=(N/2)*2-N+2
         w=X*dble(M)/dble(N)
         z=1.0D0/(1.0D0+w)
         IF(l.ne.1)THEN
          IF(k.ne.1)THEN
           d=z*z
           p=w*z
          ELSE
           p=dsqrt(z)
           d=0.5D0*z*p
           p=1.0D0-p
          END IF
         ELSE IF(k.ne.1)THEN
          p=dsqrt(w*z)
          d=0.5D0*p*z/w
         ELSE
          p=dsqrt(w)
          y=0.31830988618379D0
          d=y*z/p
          p=2.0D0*y*datan(p)
         END IF
         y=2.0D0*w/z
         j1=k+2
         IF(N.ge.j1)THEN
          IF(l.ne.1)THEN
           zk=z**((N-1)/2)
           d=d*zk*dble(N)/dble(k)
           p=p*zk+w*z*(zk-1.0D0)/(z-1.0D0)
          ELSE
           DO j=j1,N,2
            d=(1.0D0+dble(l)/dble(j-2))*d*z
            p=p+d*y/dble(j-1)
           END DO
          END IF
         END IF
         y=w*z
         i1=l+2
         IF(M.ge.i1)THEN
          z=2.0D0/z
          k=N-2
          DO i=i1,M,2
           zk=dble(i+k)
           d=y*d*zk/dble(i-2)
           p=p-z*d/zk
          END DO
         END IF
         IF(p.lt.1.0D0)THEN
          IF(p.gt.0.0D0)GO TO 20
          GO TO 10
         END IF
        END IF
       END IF
       fvalue=0D0
       RETURN
      END IF
   10 fvalue=1D0
      X=0D0
      RETURN
   20 fvalue=1.0D0-p
      RETURN
      END