DIGITAL Fortran 90
User Manual for
DIGITAL UNIX Systems


Previous Contents Index

To view the explanation of a specific message using the online release notes, use the more (or view ) command on a system where DIGITAL Fortran 90 is installed:


% more /usr/lib/cmplrs/fort90/relnotes

For More Information:


Chapter 9
Data Types and Representation

This chapter describes the following topics:

In figures in this chapter, the symbol :A specifies the address of the byte containing bit 0, which is the starting address of the represented data element.

DIGITAL Fortran 90 expects numeric data to be in native little endian order, in which the least-significant, right-most bit (bit 0) or byte has a lower address than the most-significant, left-most bit (or byte).

For More Information:

9.1 Summary of Data Types and Characteristics

Table 9-1 lists the intrinsic data types provided by DIGITAL Fortran 90, the storage required, and valid numeric ranges.

Table 9-1 DIGITAL Fortran 90 Intrinsic Data Types, Storage, and Numeric Ranges
Data Type Bytes Description
BYTE
(INTEGER*1)
1 (8 bits) A BYTE declaration is a signed integer data type equivalent to INTEGER*1 or INTEGER (KIND=1).
INTEGER 1, 2, 4, or 8 Signed integer whose size is controlled by a kind type parameter or, if a kind type parameter (or size specifier) is omitted, certain f90 command options (see Section 9.2.1).
INTEGER (KIND=1)
INTEGER*1
1 (8 bits) Signed integer value from --128 to 127 (--2**7 to 2**7--1). Unsigned values from 0 to 255 (2**8-1) 1.
INTEGER (KIND=2)
INTEGER*2
2 (16 bits) Signed integer value from --32,768 to 32,767 (--2**15 to 2**15--1). Unsigned values from 0 to 65535 (2**16-1) 1.
INTEGER (KIND=4)
INTEGER*4
4 (32 bits) Signed integer value from --2,147,483,648 to 2,147,483,647 (--2**31 to 2**31--1). Unsigned values from 0 to 4,294,967,295 (2**32-1) 1.
INTEGER (KIND=8)
INTEGER*8
8 (64 bits) Signed integer value from --9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (--2**63 to 2**63--1).
LOGICAL 1, 2, 4, or 8 Logical value whose size is controlled by a kind type parameter or, if a kind type parameter (or size specifier) is omitted, certain f90 command options (see Section 9.3).
LOGICAL (KIND=1)
LOGICAL*1
1 (8 bits) Logical values .TRUE. or .FALSE. 2
LOGICAL (KIND=2)
LOGICAL*2
2 (16 bits) Logical values .TRUE. or .FALSE. 2
LOGICAL (KIND=4)
LOGICAL*4
4 (32 bits) Logical values .TRUE. or .FALSE. 2
LOGICAL (KIND=8)
LOGICAL*8
8 (64 bits) Logical values .TRUE. or .FALSE. 2
REAL 4, 8, or 16 Real floating-point numbers whose size is controlled by a kind type parameter or, if a kind type parameter (or size specifier) is omitted, certain f90 command options (see Section 9.4.1).
REAL (KIND=4)
REAL*4
4 (32 bits) Single-precision real floating-point values in IEEE S_float format ranging from 1.17549435E--38 to 3.40282347E38. Values between 1.17549429E--38 and 1.40129846E--45 are denormalized 3. You cannot write a constant for a denormalized number.
DOUBLE PRECISION
REAL (KIND=8)
REAL*8
8 (64 bits) Double-precision real floating-point values in IEEE T_float format ranging from 2.2250738585072013D-308 to 1.7976931348623158D308. Values between 2.2250738585072008D--308 and 4.94065645841246544D--324 are denormalized 3. You cannot write a constant for a denormalized number.
REAL (KIND=16)
REAL*16
16 (128 bits) Extended-precision real floating-point values in DIGITAL IEEE style X_float format ranging from 6.4751751194380251109244389582276465524996Q-4966 to 1.189731495357231765085759326628007016196477Q4932.
COMPLEX 8 or 16 Complex floating-point numbers whose size is controlled by a kind type parameter or, if a kind type parameter (or size specifier) is omitted, the f90 command options described in Section 9.4.1.
COMPLEX (KIND=4)
COMPLEX*8
8 (64 bits) Single-precision complex floating-point values in a pair of IEEE S_float format parts: real and imaginary. The real and imaginary parts range from 1.17549435E--38 to 3.40282347E38. Values between 1.17549429E--38 and 1.40129846E--45 are denormalized 3. You cannot write a constant for a denormalized number.
DOUBLE COMPLEX
COMPLEX (KIND=8)
COMPLEX*16
16 (128 bits) Double-precision complex floating-point values in a pair of IEEE T_float format parts: real and imaginary. The real and imaginary parts each range from 2.2250738585072013D-308 to 1.7976931348623158D308. Values between 2.2250738585072008D--308 and 4.94065645841246544D--324 are denormalized 3. You cannot write a constant for a denormalized number.
CHARACTER 1 byte (8 bits) per character Character data represented by character code convention. Character declarations can be in the form CHARACTER(LEN= n), CHARACTER( n), or CHARACTER* n, where n is the number of bytes or n can be (*) to indicate passed-length format.
HOLLERITH 1 byte (8 bits) per Hollerith character Hollerith constants.


1This range is allowed for assignment to variables of this type, but the data type is treated as signed in arithmetic operations.
2Logical data type ranges correspond to their comparable integer data type ranges. For example, in LOGICAL(KIND=2) L, the range for L is the same as the range for INTEGER(KIND=2) integers.
3For more information on floating-point underflow, see Section 3.35.

In addition to the intrinsic numeric data types, you can also define nondecimal (binary, octal, or hexadecimal) constants as explained in the DIGITAL Fortran Language Reference Manual.

9.2 Integer Data Representations

Integer data lengths can be one, two, four, or eight bytes in length.

Integer data is signed with the sign bit being 0 (zero) for positive numbers and 1 for negative numbers.

To improve performance, avoid using 2-byte or 1-byte integer declarations (see Chapter 5).

9.2.1 Integer Declarations and f90 Options

The default size used for an INTEGER data declaration without a kind parameter is INTEGER (KIND=4) (same as INTEGER*4), unless you do one of the following:

9.2.2 INTEGER (KIND=1) or INTEGER*1 Representation

Intrinsic INTEGER (KIND=1) or INTEGER*1 signed values range from --128 to 127 and are stored in a two's complement representation. For example:


+22 = 16(hex) 
 -7 = F9(hex) 

INTEGER (KIND=1) or INTEGER*1 values are stored in one byte, as shown in Figure 9-1.

Figure 9-1 INTEGER (KIND =1) or INTEGER*1 Representation


9.2.3 INTEGER (KIND=2) or INTEGER*2 Representation

Intrinsic INTEGER (KIND=2) or INTEGER*2 signed values range from --32,768 to 32,767 and are stored in a two's complement representation. For example:


+22 = 0016(hex) 
 -7 = FFF9(hex) 

INTEGER (KIND=2) or INTEGER*2 values are stored in two contiguous bytes, as shown in Figure 9-2.

Figure 9-2 INTEGER (KIND =2) or INTEGER*2 Representation


9.2.4 INTEGER (KIND=4) or INTEGER*4 Representation

Intrinsic INTEGER (KIND=4) or INTEGER*4 signed values range from --2,147,483,648 to 2,147,483,647 and are stored in a two's complement representation. INTEGER (KIND=4) or INTEGER*4 values are stored in four contiguous bytes, as shown in Figure 9-3.

Figure 9-3 INTEGER (KIND =4) or INTEGER*4 Representation


9.2.5 INTEGER (KIND=8) or INTEGER*8 Representation

Intrinsic INTEGER (KIND=8) or INTEGER*8 signed values range from --9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 and are stored in a two's complement representation. INTEGER*8 or INTEGER (KIND=8) values are stored in eight contiguous bytes, as shown in Figure 9-4.

Figure 9-4 INTEGER (KIND =8) or INTEGER*8 Representation


For More Information:

9.3 Logical Data Representations

Logical data can be one, two, four, or eight bytes in length.

The default size used for an LOGICAL data declaration without a kind parameter (or size specifier) is LOGICAL (KIND=4) (same as LOGICAL*4), unless you do one of the following:

To improve default performance, avoid using 2-byte or 1-byte logical declarations (see Chapter 5).

Intrinsic LOGICAL*1 or LOGICAL (KIND=1) values are stored in a single byte.

Logical (intrinsic) values can also be stored in the following sizes of contiguous bytes starting on an arbitrary byte boundary:

The low-order bit determines whether the logical value is true or false. Logical variables can also be interpreted as integer data (an extension to the Fortran 90 standard). For example, in addition to having logical values .TRUE. and .FALSE., LOGICAL*1 data can also have values in the range --128 to 127.

LOGICAL*1, LOGICAL*2, LOGICAL*4, and LOGICAL*8 data representations appear in Figure 9-5.

Figure 9-5 LOGICAL Representations


For More Information:

9.4 Native IEEE Floating-Point Representations and Exceptional Values

Floating-point numbers are stored on DIGITAL UNIX systems in standard IEEE little endian floating-point notation, as follows:

COMPLEX numbers use a pair of little endian REAL values to denote the real and imaginary parts of the data, as follows:

All floating-point formats represent fractions in sign-magnitude notation, with the binary radix point to the right of the most-significant bit. Fractions are assumed to be normalized, and therefore the most-significant bit is not stored. This is called "hidden bit normalization". The hidden bit is assumed to be 1 unless the exponent is 0. If the exponent equals 0, then the value represented is denormalized (subnormal) or plus or minus 0 (zero).

For an explanation of the representation of NaN, Infinity, and related IEEE exceptional values on Alpha systems, see Section 9.4.7.

9.4.1 REAL and COMPLEX Declarations and f90 Options

The default size for REAL and COMPLEX data declarations are as follows:

To control the size of all REAL or COMPLEX declarations without a kind parameter, use the f90 command -real_size nn and -r8 (see Section 3.65).

You can explicitly declare the length of a REAL or a COMPLEX declaration using a kind parameter or specify DOUBLE PRECISION or DOUBLE COMPLEX. To control the size of all DOUBLE PRECISION declarations, use the f90 command -double_size nn (see Section 3.65).

Intrinsic REAL kinds are 4 (single precision) and 8 (double precision); intrinsic COMPLEX kinds are also 4 (single precision) and 8 (double precision), such as REAL (KIND=4) for single-precision floating-point data. To obtain the kind of a variable, use the KIND intrinsic function. You can also use a size specifier, such as REAL*4, but be aware this is an extension to the Fortran 90 standard.

9.4.2 REAL (KIND=4) or REAL*4 Representation

Intrinsic REAL (KIND=4) or REAL*4 (single precision REAL) data occupies four contiguous bytes stored in IEEE S_float format. Bits are labeled from the right, 0 through 31, as shown in Figure 9-6.

Figure 9-6 REAL (KIND =4) or REAL*4 Representation


The form of REAL (KIND=4) or REAL*4 data is sign magnitude, with:

The value of data is in the approximate range: 1.17549435E--38 (normalized) to 3.40282347E38. The IEEE denormalized limit is 1.40129846E--45.

The precision is approximately one part in 2**23, typically seven decimal digits.

9.4.3 REAL (KIND=8) or REAL*8 Representation

Intrinsic REAL (KIND=8) or REAL*8 (same as DOUBLE PRECISION) data occupies eight contiguous bytes stored in IEEE T_float format. Bits are labeled from the right, 0 through 63, as shown in Figure 9-7.

Figure 9-7 REAL (KIND =8) or REAL*8 Representation


The form of REAL (KIND=8) or REAL*8 data is sign magnitude, with:

The value of data is in the approximate range: 2.2250738585072013D-308 (normalized) to 1.7976931348623158D308. The IEEE denormalized limit is 4.94065645841246544D-324.

The precision is approximately one part in 2**52, typically 15 decimal digits.

9.4.4 REAL (KIND=16) or REAL*16 Representation

Intrinsic REAL (KIND=16) or REAL*16 (extended precision) data occupies 16 contiguous bytes stored in DIGITAL IEEE style X_float format. Bits are labeled from the right, 0 through 127, as shown in Figure 9-8.

Figure 9-8 REAL (KIND =16) or REAL*16 Representation


The form of REAL*16 data is sign magnitude, with:

The value of data is in the approximate range: 6.4751751194380251109244389582276465524996Q-4966 to 1.189731495357231765085759326628007016196477Q4932.

Unlike other floating-point formats, there is little if any performance penalty from using denormalized extended-precision numbers. This is because accessing denormalized REAL (KIND=16) numbers does not result in an arithmetic trap (the extended-precision format is emulated in software). The smallest normalized number is 3.362103143112093506262677817321753Q-4932.

The precision is approximately one part in 2**112 or typically 33 decimal digits.

9.4.5 COMPLEX (KIND=4) or COMPLEX*8 Representation

Intrinsic COMPLEX (KIND=4) or COMPLEX*8 (single-precision COMPLEX) data is eight contiguous bytes containing a pair of REAL (KIND=4) or REAL*4 values stored in IEEE S_float format.

The low-order four bytes contain REAL (KIND=4) data that represents the real part of the complex number. The high-order four bytes contain REAL (KIND=4) data that represents the imaginary part of the complex number, as shown in Figure 9-9.

Figure 9-9 COMPLEX (KIND =4) or COMPLEX*8 Representation


The limits and underflow characteristics for REAL (KIND=4) or REAL*4 apply to the two separate real and imaginary parts of a COMPLEX (KIND=4) or COMPLEX*8 number. Like REAL (KIND=4) numbers, the sign bit representation is 0 (zero) for positive numbers and 1 for negative numbers.


Previous Next Contents Index