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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
!**********************************************************************
! ROUTINE: FUZZY FORTRAN OPERATORS
! PURPOSE: Illustrate Hindmarsh's computation of EPS, and APL
! tolerant comparisons, tolerant CEIL/FLOOR, and Tolerant
! ROUND functions - implemented in Fortran.
! PLATFORM: PC Windows Fortran, Compaq-Digital CVF 6.1a, AIX XLF90
! TO RUN: Windows: DF EPS.F90
! AIX: XLF90 eps.f -o eps.exe -qfloat=nomaf
! CALLS: none
! AUTHOR: H. D. Knoble <hdk@psu.edu> 22 September 1978
! REVISIONS:
!**********************************************************************
!
DOUBLE PRECISION EPS,EPS3, X,Y,Z, D1MACH,TFLOOR,TCEIL,EPSF90
LOGICAL TEQ,TNE,TGT,TGE,TLT,TLE
!---Following are Fuzzy Comparison (arithmetic statement) Functions.
!
TEQ(X,Y)=DABS(X-Y).LE.DMAX1(DABS(X),DABS(Y))*EPS3
TNE(X,Y)=.NOT.TEQ(X,Y)
TGT(X,Y)=(X-Y).GT.DMAX1(DABS(X),DABS(Y))*EPS3
TLE(X,Y)=.NOT.TGT(X,Y)
TLT(X,Y)=TLE(X,Y).AND.TNE(X,Y)
TGE(X,Y)=TGT(X,Y).OR.TEQ(X,Y)
!
!---Compute EPS for this computer. EPS is the smallest real number on
! this architecture such that 1+EPS>1 and 1-EPS<1.
! EPSILON(X) is a Fortran 90 built-in Intrinsic function. They should
! be identically equal.
!
EPS=D1MACH(NULL)
EPSF90=EPSILON(X)
IF(EPS.NE.EPSF90) THEN
WRITE(*,2)'EPS=',EPS,' .NE. EPSF90=',EPSF90
2 FORMAT(A,Z16,A,Z16)
ENDIF
!---Accept a representation if exact, or one bit on either side.
EPS3=3.D0*EPS
WRITE(*,1) EPS,EPS, EPS3,EPS3
1 FORMAT(' EPS=',D16.8,2X,Z16, ', EPS3=',D16.8,2X,Z16)
!---Illustrate Fuzzy Comparisons using EPS3. Any other magnitudes will
! behave similarly.
Z=1.D0
I=49
X=1.D0/I
Y=X*I
WRITE(*,*) 'X=1.D0/',I,', Y=X*',I,', Z=1.D0'
WRITE(*,*) 'Y=',Y,' Z=',Z
WRITE(*,3) X,Y,Z
3 FORMAT(' X=',Z16,' Y=',Z16,' Z=',Z16)
!---Floating-point Y is not identical (.EQ.) to floating-point Z.
IF(Y.EQ.Z) WRITE(*,*) 'Fuzzy Comparisons: Y=Z'
IF(Y.NE.Z) WRITE(*,*) 'Fuzzy Comparisons: Y<>Z'
!---But Y is tolerantly (and algebraically) equal to Z.
IF(TEQ(Y,Z)) THEN
WRITE(*,*) 'but TEQ(Y,Z) is .TRUE.'
WRITE(*,*) 'That is, Y is computationally equal to Z.'
ENDIF
IF(TNE(Y,Z)) WRITE(*,*) 'and TNE(Y,Z) is .TRUE.'
WRITE(*,*) ' '
!---Evaluate Fuzzy FLOOR and CEILing Function values using a Comparison
! Tolerance, CT, of EPS3.
X=0.11D0
Y=((X*11.D0)-X)-0.1D0
YFLOOR=TFLOOR(Y,EPS3)
YCEIL=TCEIL(Y,EPS3)
55 Z=1.D0
WRITE(*,*) 'X=0.11D0, Y=X*11.D0-X-0.1D0, Z=1.D0'
WRITE(*,*) 'X=',X,' Y=',Y,' Z=',Z
WRITE(*,3) X,Y,Z
!---Floating-point Y is not identical (.EQ.) to floating-point Z.
IF(Y.EQ.Z) WRITE(*,*) 'Fuzzy FLOOR/CEIL: Y=Z'
IF(Y.NE.Z) WRITE(*,*) 'Fuzzy FLOOR/CEIL: Y<>Z'
IF(TFLOOR(Y,EPS3).EQ.TCEIL(Y,EPS3).AND.TFLOOR(Y,EPS3).EQ.Z) THEN
!---But Tolerant Floor/Ceil of Y is identical (and algebraically equal)
! to Z.
WRITE(*,*) 'but TFLOOR(Y,EPS3)=TCEIL(Y,EPS3)=Z.'
WRITE(*,*) 'That is, TFLOOR/TCEIL return exact whole numbers.'
ENDIF
STOP
END
DOUBLE PRECISION FUNCTION D1MACH (IDUM)
INTEGER IDUM
!=======================================================================
! This routine computes the unit roundoff of the machine in double
! precision. This is defined as the smallest positive machine real
! number, EPS, such that (1.0D0+EPS > 1.0D0) & (1.D0-EPS < 1.D0).
! This computation of EPS is the work of Alan C. Hindmarsh.
! For computation of Machine Parameters also see:
! W. J. Cody, "MACHAR: A subroutine to dynamically determine machine
! parameters, " TOMS 14, December, 1988; or
! Alan C. Hindmarsh at http://www.netlib.org/lapack/util/dlamch.f
! or Werner W. Schulz at http://www.ozemail.com.au/~milleraj/ .
!
! This routine appears to give bit-for-bit the same results as
! the Intrinsic function EPSILON(x) for x single or double precision.
! hdk - 25 August 1999.
!-----------------------------------------------------------------------
DOUBLE PRECISION EPS, COMP
! EPS = 1.0D0
!10 EPS = EPS*0.5D0
! COMP = 1.0D0 + EPS
! IF (COMP .NE. 1.0D0) GO TO 10
! D1MACH = EPS*2.0D0
EPS = 1.0D0
COMP = 2.0D0
DO WHILE ( COMP .NE. 1.0D0 )
EPS = EPS*0.5D0
COMP = 1.0D0 + EPS
ENDDO
D1MACH = EPS*2.0D0
RETURN
END
DOUBLE PRECISION FUNCTION TFLOOR(X,CT)
!===========Tolerant FLOOR Function.
!
! C - is given as a double precision argument to be operated on.
! it is assumed that X is represented with m mantissa bits.
! CT - is given as a Comparison Tolerance such that
! 0.lt.CT.le.3-Sqrt(5)/2. If the relative difference between
! X and a whole number is less than CT, then TFLOOR is
! returned as this whole number. By treating the
! floating-point numbers as a finite ordered set note that
! the heuristic eps=2.**(-(m-1)) and CT=3*eps causes
! arguments of TFLOOR/TCEIL to be treated as whole numbers
! if they are exactly whole numbers or are immediately
! adjacent to whole number representations. Since EPS, the
! "distance" between floating-point numbers on the unit
! interval, and m, the number of bits in X's mantissa, exist
! on every floating-point computer, TFLOOR/TCEIL are
! consistently definable on every floating-point computer.
!
! For more information see the following references:
! {1} P. E. Hagerty, "More on Fuzzy Floor and Ceiling," APL QUOTE
! QUAD 8(4):20-24, June 1978. Note that TFLOOR=FL5 took five
! years of refereed evolution (publication).
!
! {2} L. M. Breed, "Definitions for Fuzzy Floor and Ceiling", APL
! QUOTE QUAD 8(3):16-23, March 1978.
!
! H. D. KNOBLE, Penn State University.
!=====================================================================
DOUBLE PRECISION X,Q,RMAX,EPS5,CT,FLOOR,DINT
!---------FLOOR(X) is the largest integer algegraically less than
! or equal to X; that is, the unfuzzy Floor Function.
DINT(X)=X-DMOD(X,1.D0)
FLOOR(X)=DINT(X)-DMOD(2.D0+DSIGN(1.D0,X),3.D0)
!---------Hagerty's FL5 Function follows...
Q=1.D0
IF(X.LT.0)Q=1.D0-CT
RMAX=Q/(2.D0-CT)
EPS5=CT/Q
TFLOOR=FLOOR(X+DMAX1(CT,DMIN1(RMAX,EPS5*DABS(1.D0+FLOOR(X)))))
IF(X.LE.0 .OR. (TFLOOR-X).LT.RMAX)RETURN
TFLOOR=TFLOOR-1.D0
RETURN
END
DOUBLE PRECISION FUNCTION TCEIL(X,CT)
!==========Tolerant Ceiling Function.
! See TFLOOR.
DOUBLE PRECISION X,CT,TFLOOR
TCEIL= -TFLOOR(-X,CT)
RETURN
END
DOUBLE PRECISION FUNCTION ROUND(X,CT)
!=========Tolerant Round Function
! See Knuth, Art of Computer Programming, Vol. 1, Problem 1.2.4-5.
DOUBLE PRECISION TFLOOR,X,CT
ROUND=TFLOOR(X+0.5D0,CT)
RETURN
END
|