1
************************************************************************
2
* This is the file avh_oni_d1mach.f of the package *
4
* Oneloop with Numerical Integration *
6
* for the evaluation of 1-loop scalar 1-, 2-, 3- and 4-point functions *
8
* author: Andreas van Hameren <hamerenREMOVETHIS@ifj.edu.pl> *
10
************************************************************************
12
* Have a look at the file avh_oni_hello.f for more information. *
14
************************************************************************
16
* Contains function d1mach plus dependencies from port . *
17
* Original obtained from netlib.org *
19
* All function and subroutine names prepended with "avh_oni_" *
21
************************************************************************
23
DOUBLE PRECISION FUNCTION avh_oni_D1MACH(I)
26
C DOUBLE-PRECISION MACHINE CONSTANTS
27
C D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
28
C D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
29
C D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
30
C D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
31
C D1MACH( 5) = LOG10(B)
38
INTEGER SC, CRAY1(38), J
40
SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
41
DOUBLE PRECISION DMACH(5)
42
EQUIVALENCE (DMACH(1),SMALL(1))
43
EQUIVALENCE (DMACH(2),LARGE(1))
44
EQUIVALENCE (DMACH(3),RIGHT(1))
45
EQUIVALENCE (DMACH(4),DIVER(1))
46
EQUIVALENCE (DMACH(5),LOG10(1))
47
C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES.
48
C R1MACH CAN HANDLE AUTO-DOUBLE COMPILING, BUT THIS VERSION OF
49
C D1MACH DOES NOT, BECAUSE WE DO NOT HAVE QUAD CONSTANTS FOR
51
C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
54
C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
55
C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
56
C mail netlib@research.bell-labs.com
57
C send old1mach from blas
58
C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
60
C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
61
C DATA SMALL(1),SMALL(2) / O402400000000, O000000000000 /
62
C DATA LARGE(1),LARGE(2) / O376777777777, O777777777777 /
63
C DATA RIGHT(1),RIGHT(2) / O604400000000, O000000000000 /
64
C DATA DIVER(1),DIVER(2) / O606400000000, O000000000000 /
65
C DATA LOG10(1),LOG10(2) / O776464202324, O117571775714 /, SC/987/
67
C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
69
C DATA SMALL(1),SMALL(2) / 8388608, 0 /
70
C DATA LARGE(1),LARGE(2) / 2147483647, -1 /
71
C DATA RIGHT(1),RIGHT(2) / 612368384, 0 /
72
C DATA DIVER(1),DIVER(2) / 620756992, 0 /
73
C DATA LOG10(1),LOG10(2) / 1067065498, -2063872008 /, SC/987/
75
C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
76
C DATA SMALL(1),SMALL(2) / O000040000000, O000000000000 /
77
C DATA LARGE(1),LARGE(2) / O377777777777, O777777777777 /
78
C DATA RIGHT(1),RIGHT(2) / O170540000000, O000000000000 /
79
C DATA DIVER(1),DIVER(2) / O170640000000, O000000000000 /
80
C DATA LOG10(1),LOG10(2) / O177746420232, O411757177572 /, SC/987/
82
C ON FIRST CALL, IF NO DATA UNCOMMENTED, TEST MACHINE TYPES.
85
IF ( SMALL(1) .EQ. 1117925532
86
* .AND. SMALL(2) .EQ. -448790528) THEN
87
* *** IEEE BIG ENDIAN ***
98
ELSE IF ( SMALL(2) .EQ. 1117925532
99
* .AND. SMALL(1) .EQ. -448790528) THEN
100
* *** IEEE LITTLE ENDIAN ***
103
LARGE(2) = 2146435071
105
RIGHT(2) = 1017118720
107
DIVER(2) = 1018167296
109
LOG10(2) = 1070810131
110
LOG10(1) = 1352628735
111
ELSE IF ( SMALL(1) .EQ. -2065213935
112
* .AND. SMALL(2) .EQ. 10752) THEN
113
* *** VAX WITH D_FLOATING ***
123
LOG10(2) = -805796613
124
ELSE IF ( SMALL(1) .EQ. 1267827943
125
* .AND. SMALL(2) .EQ. 704643072) THEN
126
* *** IBM MAINFRAME ***
129
LARGE(1) = 2147483647
135
LOG10(1) = 1091781651
136
LOG10(2) = 1352628735
137
ELSE IF ( SMALL(1) .EQ. 1120022684
138
* .AND. SMALL(2) .EQ. -448790528) THEN
142
LARGE(1) = 2147483647
144
RIGHT(1) = 1019215872
146
DIVER(1) = 1020264448
148
LOG10(1) = 1072907283
149
LOG10(2) = 1352628735
150
ELSE IF ( SMALL(1) .EQ. 815547074
151
* .AND. SMALL(2) .EQ. 58688) THEN
152
* *** VAX G-FLOATING ***
161
LOG10(1) = 1142112243
162
LOG10(2) = 2046775455
166
LARGE(2) = LARGE(2) - RIGHT(2)
167
IF (LARGE(2) .EQ. 64 .AND. SMALL(2) .EQ. 0) THEN
170
CRAY1(J+1) = CRAY1(J) + CRAY1(J)
172
CRAY1(22) = CRAY1(21) + 321322
174
CRAY1(J+1) = CRAY1(J) + CRAY1(J)
176
IF (CRAY1(38) .EQ. SMALL(1)) THEN
178
CALL avh_oni_I1MCRY(SMALL(1), J, 8285, 8388608, 0)
180
CALL avh_oni_I1MCRY(LARGE(1), J, 24574, 16777215, 16777215)
181
CALL avh_oni_I1MCRY(LARGE(2), J, 0, 16777215, 16777214)
182
CALL avh_oni_I1MCRY(RIGHT(1), J, 16291, 8388608, 0)
184
CALL avh_oni_I1MCRY(DIVER(1), J, 16292, 8388608, 0)
186
CALL avh_oni_I1MCRY(LOG10(1), J, 16383, 10100890, 8715215)
187
CALL avh_oni_I1MCRY(LOG10(2), J, 0, 16226447, 9001388)
200
IF (DMACH(4) .GE. 1.0D0) STOP 778
201
IF (I .LT. 1 .OR. I .GT. 5) THEN
202
WRITE(*,*) 'D1MACH(I): I =',I,' is out of bounds.'
205
avh_oni_D1MACH = DMACH(I)
207
9000 FORMAT(/' Adjust D1MACH by uncommenting data statements'/
208
*' appropriate for your machine.')
209
* /* Standard C source for D1MACH -- remove the * in column 1 */
213
*double d1mach_(long *i)
216
* case 1: return DBL_MIN;
217
* case 2: return DBL_MAX;
218
* case 3: return DBL_EPSILON/FLT_RADIX;
219
* case 4: return DBL_EPSILON;
220
* case 5: return log10((double)FLT_RADIX);
222
* fprintf(stderr, "invalid argument: d1mach(%ld)\n", *i);
223
* exit(1); return 0; /* some compilers demand return values */
226
SUBROUTINE avh_oni_I1MCRY(A, A1, B, C, D)
227
**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
228
INTEGER A, A1, B, C, D