#1
  1. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Mar 2006
    Posts
    68
    Rep Power
    24

    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
  2. #2
  3. Contributing User
    Devshed Intermediate (1500 - 1999 posts)

    Join Date
    Dec 2004
    Location
    Meriden, Connecticut
    Posts
    1,797
    Rep Power
    154
    You are converting to C++. You don't need and may not be able to make a perfect conversion. The two languages have their own features and can do things in different ways. Think of the job that the program needs to do, then write the code for it in C++. Don't just convert.
  4. #3
  5. No Profile Picture
    Contributing User
    Devshed Newbie (0 - 499 posts)

    Join Date
    Dec 2006
    Posts
    271
    Rep Power
    15
    Originally Posted by David_B
    Does FORTRAN have some predefined variables as a particular type, that "L" might be?
    Yes, in a manner of speaking.

    The old 1966 ANSI FORTRAN standard has undeclared variables with names beginning with 'I'-'N' as being type integer. The rest are floats. So your "L" is an integer if this is old Fortran IV code.

IMN logo majestic logo threadwatch logo seochat tools logo