Formats for numeric data
Several formats are available for numeric data.
External decimal (DISPLAY and NATIONAL) items
When USAGE
DISPLAY
is in effect for a category numeric data
item (either because you have coded it, or by default), each position
(byte) of storage contains one decimal digit. The items are stored
in displayable form. External decimal items that have USAGE
DISPLAY
are referred to as zoned decimal data
items.
When USAGE
NATIONAL
is in effect for a category numeric data item, 2
bytes of storage are required for each decimal digit. The items are
stored in UTF-16 format. External decimal
items that have USAGE NATIONAL must only contain valid UTF-16 digits.
If they do not, the data is illegal and the behavior of the generated
code is undefined. External decimal items that have USAGE
NATIONAL
are referred to as national decimal data
items.
National decimal data items, if signed,
must have the SIGN SEPARATE
clause in effect. All
other rules for zoned decimal items apply to national decimal items.
You can use national decimal items anywhere that other category numeric
data items can be used.
External decimal (both zoned decimal and national decimal) data items are primarily intended for receiving and sending numbers between your program and files, terminals, or printers. You can also use external decimal items as operands and receivers in arithmetic processing. However, if your program performs a lot of intensive arithmetic, and efficiency is a high priority, COBOL's computational numeric types might be a better choice for the data items used in the arithmetic.
External floating-point (DISPLAY and NATIONAL) items
When USAGE DISPLAY
is in effect for a
floating-point data item (either because you have coded it, or by
default), each PICTURE
character position (except
for v
, an implied decimal point, if used) takes 1
byte of storage. The items are stored in displayable form. External
floating-point items that have USAGE DISPLAY
are
referred to as display floating-point data items in this
information when necessary to distinguish them from external floating-point
items that have USAGE NATIONAL
.
In the
following example, Compute-Result
is implicitly defined
as a display floating-point item:
05 Compute-Result Pic -9v9(9)E-99.
The minus signs (-
) do not mean
that the mantissa and exponent must necessarily be negative numbers.
Instead, they mean that when the number is displayed, the sign appears
as a blank for positive numbers or a minus sign for negative numbers.
If you instead code a plus sign (+
), the sign appears
as a plus sign for positive numbers or a minus sign for negative numbers.
When USAGE NATIONAL
is in effect for a
floating-point data item, each PICTURE
character
position (except for v
, if used) takes 2 bytes of
storage. The items are stored as national characters (UTF-16). External
floating-point items that have USAGE NATIONAL
are
referred to as national floating-point data items.
The existing rules for display floating-point items apply to national floating-point items.
In the following
example, Compute-Result-N
is a national floating-point
item:
05 Compute-Result-N Pic -9v9(9)E-99 Usage National.
If Compute-Result-N
is
displayed, the signs appear as described above for Compute-Result
,
but in national characters. To instead display Compute-Result-N
in
EBCDIC characters, direct it to the console:
Display Compute-Result-N Upon Console
You cannot use the VALUE
clause
for external floating-point items.
As with external decimal
numbers, external floating-point numbers have to be converted (by
the compiler) to an internal representation of their numeric value
before they can be used in arithmetic operations. If you compile with
the default option ARITH (COMPAT)
, external floating-point
numbers are converted to long (64-bit) floating-point format. If you
compile with ARITH (EXTEND)
, they are instead converted
to extended-precision (128-bit) floating-point format.
Binary (COMP) items
BINARY
, COMP
,
and COMP-4
are synonyms. Binary-format numbers occupy
2, 4, or 8 bytes of storage. If the PICTURE
clause
specifies that an item is signed, the leftmost bit is used as the
operational sign.
A binary number with a PICTURE
description of
four or fewer decimal digits occupies 2 bytes; five to nine decimal
digits, 4 bytes; and 10 to 18 decimal digits, 8 bytes. Binary items
with nine or more digits require more handling by the compiler. Testing them for the SIZE ERROR
condition
and rounding is more cumbersome than with other types.
You can use binary items, for example, for indexes, subscripts, switches, and arithmetic operands or results.
Use the TRUNC(STD|OPT|BIN)
compiler
option to indicate how binary data (BINARY
, COMP
,
or COMP-4
) is to be truncated.
Native binary (COMP-5) items
Data
items that you define as USAGE COMP-5
are
represented in storage as binary data. However, unlike USAGE
COMP
items, they can contain values of magnitude up to the
capacity of the native binary representation (2, 4, or 8 bytes) rather
than being limited to the value implied by the number of 9
s
in the PICTURE
clause.
When you move or store
numeric data into a COMP-5
item, truncation occurs
at the binary field size rather than at the COBOL PICTURE
size
limit. When you reference a COMP-5
item, the full
binary field size is used in the operation.
COMP-5
is
thus particularly useful for binary data items that originate in non-COBOL
programs where the data might not conform to a COBOL PICTURE
clause.
The
table below shows the ranges of possible values for COMP-5
data
items.
PICTURE |
Storage representation | Numeric values |
---|---|---|
S9(1) through S9(4) |
Binary halfword (2 bytes) | -32768 through +32767 |
S9(5) through S9(9) |
Binary fullword (4 bytes) | -2,147,483,648 through +2,147,483,647 |
S9(10) through S9(18) |
Binary doubleword (8 bytes) | -9,223,372,036,854,775,808 through +9,223,372,036,854,775,807 |
9(1) through 9(4) |
Binary halfword (2 bytes) | 0 through 65535 |
9(5) through 9(9) |
Binary fullword (4 bytes) | 0 through 4,294,967,295 |
9(10) through 9(18) |
Binary doubleword (8 bytes) | 0 through 18,446,744,073,709,551,615 |
You can specify scaling (that is, decimal positions or
implied integer positions) in the PICTURE
clause
of COMP-5
items. If you do so, you must appropriately
scale the maximal capacities listed above. For example, a data item
you describe as PICTURE S99V99 COMP-5
is represented
in storage as a binary halfword, and supports a range of values from
-327.68 through +327.67.
Large
literals in VALUE
clauses: Literals specified
in VALUE
clauses for COMP-5
items
can, with a few exceptions, contain values of magnitude up to the
capacity of the native binary representation. See Enterprise COBOL for z/OS® Language Reference for the exceptions.
Regardless
of the setting of the TRUNC
compiler option, COMP-5
data
items behave like binary data does in programs compiled with TRUNC(BIN)
.
Packed-decimal (COMP-3) items
PACKED-DECIMAL
and COMP-3
are
synonyms. Packed-decimal items occupy 1 byte of storage for every
two decimal digits you code in the PICTURE
description,
except that the rightmost byte contains only one digit and the sign.
This format is most efficient when you code an odd number of digits
in the PICTURE
description, so that the leftmost
byte is fully used. Packed-decimal items are handled as fixed-point
numbers for arithmetic purposes.
Internal floating-point (COMP-1 and COMP-2) items
COMP-1
refers
to short floating-point format and COMP-2
refers
to long floating-point format, which occupy 4 and 8 bytes of storage,
respectively. The leftmost bit contains the sign
and the next 7 bits contain the exponent; the remaining 3 or 7 bytes
contain the mantissa.
COMP-1
and COMP-2
data
items are stored in System z® hexadecimal
format.
Unicode and the encoding of language characters
Intermediate results and arithmetic precision
Storage of character data
TRUNC
Classes and categories of data (Enterprise COBOL for z/OS Language Reference)
SIGN clause (Enterprise COBOL for z/OS Language Reference)
VALUE clause (Enterprise COBOL for z/OS Language Reference)