If both operands have the same type, then the resulting value has that type. If operands have different types, then the weaker of two types is promoted to the stronger type, where the weaker type is the one with less precision or fewer storage units. The ranking is summarized in the following table:
Data Type |
Rank |
---|---|
BYTE or LOGICAL*1 LOGICAL*2 LOGICAL*4 INTEGER*2 INTEGER*4 INTEGER*8 LOGICAL*8 REAL*4 (REAL) REAL*8 (DOUBLE PRECISION) REAL*16 (QUAD PRECISION) (SPARC only) COMPLEX*8 (COMPLEX) COMPLEX*16 (DOUBLE COMPLEX) COMPLEX*32 (QUAD COMPLEX) (SPARC only) |
1 (Weakest) 2 3 4 5 6 6 6 7 8 9 10 11 (Strongest) |
REAL*4, INTEGER*8, and LOGICAL*8 are of the same rank, but they can be the results of different pairs of operands. For example, INTEGER*8 results if you combine INTEGER*8 and any of the types between 1-5. Likewise, REAL*4 results if one of the operands is REAL*4, and the other is any of the types between 1-5. LOGICAL*8 dictates only the 8-byte size of the result.
Example of mixed mode: If R is real, and I is integer, then the expression:
R * I
has the type real, because first I is promoted to real, and then the multiplication is performed.
Note these rules for the data type of an expression:
If there is more than one operator in an expression, then the type of the last operation performed becomes the type of the final value of the expression.
Integer operators apply to only integer operands.
Example: An expression that evaluates to zero:
2/3 + 3/4
When an INTEGER*8 operand is mixed with REAL*4 operands, the result is REAL*8.
There is one extension to this: a logical or byte operand in an arithmetic context is used as an integer.
Real operators apply to only real operands, or to combinations of byte, logical, integer, and real operands. An integer operand mixed with a real operand is promoted to real; the fractional part of the new real number is zero. For example, if R is real, and I is integer, then R+I is real. However, (2/3)*4.0 is 0.
Double precision operators apply to only double precision operands, and any operand of lower precision is promoted to double precision. The new least significant bits of the new double precision number are set to zero. Promoting a real operand does not increase the accuracy of the operand.
Complex operators apply to only complex operands. Any integer operands are promoted to real, and they are then used as the real part of a complex operand, with the imaginary part set to zero.
Numeric operations are allowed on logical variables. @ You can use a logical value any place where the FORTRAN Standard requires a numeric value. The numeric can be integer, real, complex, double precision, double complex, or real*16 (SPARC only). The compiler implicitly converts the logical to the appropriate numeric. If you use these features, your program may not be portable.
Example: Some combinations of both integer and logical types:
COMPLEX C1 / ( 1.0, 2.0 ) / INTEGER*2 I1, I2, I3 LOGICAL L1, L2, L3, L4, L5 REAL R1 / 1.0 / DATA I1 / 8 /, I2 / 'W' /, I3 / 0 / DATA L1/.TRUE./, L2/.TRUE./, L3/.TRUE./, L4/.TRUE./, & L5/.TRUE./ L1 = L1 + 1 I2 = .NOT. I2 L2 = I1 .AND. I3 L3 = I1 .OR. I2 L4 = L4 + C1 L5 = L5 + R1
For integer operands with a logical operator, the operation is done bit by bit. The result is an integer.
If the operands are mixed integer and logical, then the logicals are converted to integers, and the result is an integer.