HP OpenVMS Systems Documentation
This chapter describes the following topics concerning numeric data handling:
The storage considerations applicable to tables are described in Chapter 4.
The USAGE clause of a numeric data item specifies the data's internal
format in storage. When you do not specify a USAGE clause, the default
usage is DISPLAY. For further information about internal
representations, refer to the USAGE clause tables in the HP COBOL Reference Manual.
2.2 Specifying Alignment
In HP COBOL, all records, and elementary items with level 01 or
77, begin at an address that is a multiple of 8 bytes (a quadword
boundary). By default, the HP COBOL compiler will locate a
subordinate data item at the next unassigned byte location. However,
the SYNCHRONIZED clause, the
flag (on Tru64 UNIX), the /ALIGNMENT qualifier (on OpenVMS Alpha and
I64), and alignment directives can be used to modify this behavior,
causing some numeric data items to be aligned on a 2-, 4-, or 8-byte
boundary. You can thus tune data alignment for optimum performance,
compatibility with HP COBOL for OpenVMS VAX, or flexibility. (See Chapter 16, Managing Memory and Data Access
and Chapter 15, Optimizing Your HP COBOL Program in this manual, and refer to the SYNCHRONIZED clause
in the HP COBOL Reference Manual for a complete discussion of alignment.)
2.3 Sign Conventions
Do not use unsigned numeric items in arithmetic operations. They usually cause programming errors and are handled less efficiently than signed numeric items. The following example shows how unsigned numeric items can cause errors:
DATA DIVISION . . . 01 A PIC 9(5) COMP VALUE 2. 01 B PIC 9(5) COMP VALUE 5.
SUBTRACT B FROM A. (A = 3) SUBTRACT 1 FROM A. (A = 2)
COMPUTE A = (A - B) - 1 (A = 4)
The absence of signs for the numeric items A and B results in two
different answers after parallel arithmetic operations have been done.
This occurs because internal temporaries (required by the COMPUTE
statement) are signed. Thus, the result of (A--B) within the COMPUTE
statement is --3; --3 minus 1 is --4 and the value of A then becomes 4.
2.4 Invalid Values in Numeric Items
All HP COBOL arithmetic operations store valid values in their result items. However, it is possible, through group moves or REDEFINES, to store data in numeric items that do not conform to the data definitions of those items.
The results of arithmetic operations that use invalid data in numeric
items are undefined. You can use the
flag (on the Tru64 UNIX operating system) or the /CHECK=DECIMAL qualifier (on the
OpenVMS Alpha or I64 operating systems)
to validate numeric digits when using display numeric items in a
numeric context; note that this flag or qualifier causes a program to
terminate abnormally if there is invalid data. In the case of data with
blanks (typically, records in a file), you can use the
flag (on Tru64 UNIX) or the /CONVERT qualifier (on OpenVMS Alpha or
I64) to change all blanks to zeroes before performing the arithmetic
If you specify both the
decimal and the
flags (on Tru64 UNIX), or both the /CHECK=DECIMAL and the /CONVERT
qualifiers on OpenVMS Alpha or I64, the conversion of blanks will be
done prior to the validation of the resulting numeric digits. Note that
the use of either or both of these qualifiers increases the execution
time of the program. Refer to HP COBOL online help (at the OpenVMS
system prompt), or
(on Tru64 UNIX) for more information.
2.5 Evaluating Numeric Items
The following sections explain these conditional expressions in detail.
2.5.1 Numeric Relation Test
A numeric relation test compares two numeric quantities and determines if the specified relation between them is true. For example, the following statement compares item FIELD1 to item FIELD2 and determines if the numeric value of FIELD1 is greater than the numeric value of FIELD2:
IF FIELD1 > FIELD2 ...
If the relation condition is true, the program control takes the true path of the statement.
Table 2-1 describes the relational operators.
IS [NOT] GREATER THAN
IS [NOT] >
|The first operand is greater than (or not greater than) the second operand.|
IS [NOT] LESS THAN
IS [NOT] <
|The first operand is less than (or not less than) the second operand.|
IS [NOT] EQUAL TO
IS [NOT] =
|The first operand is equal to (or not equal to) the second operand.|
IS GREATER THAN OR
|The first operand is greater than or equal to the second operand.|
IS LESS THAN OR EQUAL TO
|The first operand is less than or equal to the second operand.|
Comparison of two numeric operands is valid regardless of their USAGE clauses.
The length of the literal or arithmetic expression operands (in terms of the number of digits represented) is not significant. Zero is a unique value, regardless of the sign.