|
FORTRAN (OpenWATCOM) Variable Question
Hi, folks.
I am translating an old FORTRAN program into C++. To help me, I have downloaded and installed the OpenWATCOM compiler. One bug that keeps coming up when I try to compile the old program regards a variable "L". Here is a code chunk:
Code:
SUBROUTINE RPOLY(OP, DEGREE, ZEROR, ZEROI, RPO 10
* FAIL)
C FINDS THE ZEROS OF A REAL POLYNOMIAL
C OP - DOUBLE PRECISION VECTOR OF COEFFICIENTS IN
C ORDER OF DECREASING POWERS.
C DEGREE - INTEGER DEGREE OF POLYNOMIAL.
C ZEROR, ZEROI - OUTPUT DOUBLE PRECISION VECTORS OF
C REAL AND IMAGINARY PARTS OF THE
C ZEROS.
C FAIL - OUTPUT LOGICAL PARAMETER, TRUE ONLY IF
C LEADING COEFFICIENT IS ZERO OR IF RPOLY
C HAS FOUND FEWER THAN DEGREE ZEROS.
C IN THE LATTER CASE DEGREE IS RESET TO
C THE NUMBER OF ZEROS FOUND.
C TO CHANGE THE SIZE OF POLYNOMIALS WHICH CAN BE
C SOLVED, RESET THE DIMENSIONS OF THE ARRAYS IN THE
C COMMON AREA AND IN THE FOLLOWING DECLARATIONS.
C THE SUBROUTINE USES SINGLE PRECISION CALCULATIONS
C FOR SCALING, BOUNDS AND ERROR CALCULATIONS. ALL
C CALCULATIONS FOR THE ITERATIONS ARE DONE IN DOUBLE
C PRECISION.
COMMON /GLOBAL/ P, QP, K, QK, SVK, SR, SI, U,
* V, A, B, C, D, A1, A2, A3, A6, A7, E, F, G,
* H, SZR, SZI, LZR, LZI, ETA, ARE, MRE, N, NN
DOUBLE PRECISION P(101), QP(101), K(101),
* QK(101), SVK(101), SR, SI, U, V, A, B, C, D,
* A1, A2, A3, A6, A7, E, F, G, H, SZR, SZI,
* LZR, LZI
REAL ETA, ARE, MRE
INTEGER N, NN
DOUBLE PRECISION OP(101), TEMP(101),
* ZEROR(100), ZEROI(100), T, AA, BB, CC, DABS,
* FACTOR
REAL PT(101), LO, MAX, MIN, XX, YY, COSR,
* SINR, XXX, X, SC, BND, XM, FF, DF, DX, INFIN,
* SMALNO, BASE
INTEGER DEGREE, CNT, NZ, I, J, JJ, NM1
LOGICAL FAIL, ZEROK
C THE FOLLOWING STATEMENTS SET MACHINE CONSTANTS USED
C IN VARIOUS PARTS OF THE PROGRAM. THE MEANING OF THE
C FOUR CONSTANTS ARE...
C ETA THE MAXIMUM RELATIVE REPRESENTATION ERROR
C WHICH CAN BE DESCRIBED AS THE SMALLEST
C POSITIVE FLOATING POINT NUMBER SUCH THAT
C 1.D0+ETA IS GREATER THAN 1.
C INFINY THE LARGEST FLOATING-POINT NUMBER.
C SMALNO THE SMALLEST POSITIVE FLOATING-POINT NUMBER
C IF THE EXPONENT RANGE DIFFERS IN SINGLE AND
C DOUBLE PRECISION THEN SMALNO AND INFIN
C SHOULD INDICATE THE SMALLER RANGE.
C BASE THE BASE OF THE FLOATING-POINT NUMBER
C SYSTEM USED.
C THE VALUES BELOW CORRESPOND TO THE BURROUGHS B6700
BASE = 8.
ETA = .5*BASE**(1-26)
INFIN = 4.3E68
SMALNO = 1.0E-45
C ARE AND MRE REFER TO THE UNIT ERROR IN + AND *
C RESPECTIVELY. THEY ARE ASSUMED TO BE THE SAME AS
C ETA.
ARE = ETA
MRE = ETA
LO = SMALNO/ETA
C INITIALIZATION OF CONSTANTS FOR SHIFT ROTATION
XX = .70710678
YY = -XX
COSR = -.069756474
SINR = .99756405
FAIL = .FALSE.
N = DEGREE
NN = N + 1
C ALGORITHM FAILS IF THE LEADING COEFFICIENT IS ZERO.
IF (OP(1).NE.0.D0) GO TO 10
FAIL = .TRUE.
DEGREE = 0
RETURN
C REMOVE THE ZEROS AT THE ORIGIN IF ANY
10 IF (OP(NN).NE.0.0D0) GO TO 20
J = DEGREE - N + 1
ZEROR(J) = 0.D0
ZEROI(J) = 0.D0
NN = NN - 1
N = N - 1
GO TO 10
C MAKE A COPY OF THE COEFFICIENTS
20 DO 30 I=1,NN
P(I) = OP(I)
30 CONTINUE
C START THE ALGORITHM FOR ONE ZERO
40 IF (N.GT.2) GO TO 60
IF (N.LT.1) RETURN
C CALCULATE THE FINAL ZERO OR PAIR OF ZEROS
IF (N.EQ.2) GO TO 50
ZEROR(DEGREE) = -P(2)/P(1)
ZEROI(DEGREE) = 0.0D0
RETURN
50 CALL QUAD(P(1), P(2), P(3), ZEROR(DEGREE-1),
* ZEROI(DEGREE-1), ZEROR(DEGREE), ZEROI(DEGREE))
RETURN
C FIND LARGEST AND SMALLEST MODULI OF COEFFICIENTS.
60 MAX = 0.
MIN = INFIN
DO 70 I=1,NN
X = ABS(SNGL(P(I)))
IF (X.GT.MAX) MAX = X
IF (X.NE.0. .AND. X.LT.MIN) MIN = X
70 CONTINUE
C SCALE IF THERE ARE LARGE OR VERY SMALL COEFFICIENTS
C COMPUTES A SCALE FACTOR TO MULTIPLY THE
C COEFFICIENTS OF THE POLYNOMIAL. THE SCALING IS DONE
C TO AVOID OVERFLOW AND TO AVOID UNDETECTED UNDERFLOW
C INTERFERING WITH THE CONVERGENCE CRITERION.
C THE FACTOR IS A POWER OF THE BASE
SC = LO/MIN
IF (SC.GT.1.0) GO TO 80
IF (MAX.LT.10.) GO TO 110
IF (SC.EQ.0.) SC = SMALNO
GO TO 90
80 IF (INFIN/SC.LT.MAX) GO TO 110
90 L = ALOG(SC)/ALOG(BASE) + .5
"L" is not passed into the routine or declared before being used. Judging by the context in which it is used, it looks like a float variable. However, other parts of the program imply it might be an integer variable.
Any FORTRAN programmers here that might help?
Does FORTRAN have some predefined variables as a particular type, that "L" might be?
Regards.
David
|