In
computing
Computing is any goal-oriented activity requiring, benefiting from, or creating computer, computing machinery. It includes the study and experimentation of algorithmic processes, and the development of both computer hardware, hardware and softw ...
, decimal128 is a
decimal floating-point number format that occupies 128 bits in
memory
Memory is the faculty of the mind by which data or information is encoded, stored, and retrieved when needed. It is the retention of information over time for the purpose of influencing future action. If past events could not be remembe ...
. Formally introduced in
IEEE 754-2008
The Institute of Electrical and Electronics Engineers (IEEE) is an American 501(c)(3) public charity professional organization for electrical engineering, electronics engineering, and other related disciplines.
The IEEE has a corporate office ...
,
it is intended for applications where it is necessary to emulate decimal rounding exactly, such as financial and tax computations.
Format
The decimal128 format supports 34
decimal digit
A numerical digit (often shortened to just digit) or numeral is a single symbol used alone (such as "1"), or in combinations (such as "15"), to represent numbers in positional notation, such as the common base 10. The name "digit" originate ...
s of
significand
The significand (also coefficient, sometimes argument, or more ambiguously mantissa, fraction, or characteristic) is the first (left) part of a number in scientific notation or related concepts in floating-point representation, consisting of its s ...
and an
exponent
In mathematics, exponentiation, denoted , is an operation involving two numbers: the ''base'', , and the ''exponent'' or ''power'', . When is a positive integer, exponentiation corresponds to repeated multiplication of the base: that is, i ...
range of −6143 to +6144, i.e. to . Because the significand is not normalized, most values with less than 34
significant digits
Significant figures, also referred to as significant digits, are specific digits within a number that is written in positional notation that carry both reliability and necessity in conveying a particular quantity. When presenting the outcom ...
have multiple possible representations; , etc. This set of representations for a same value is called a ''
cohort''. Zero has 12288 possible representations (24576 if both
signed zero
Signed zero is zero with an associated sign. In ordinary arithmetic, the number 0 does not have a sign, so that −0, +0 and 0 are equivalent. However, in computing, some number representations allow for the existence of two zeros, often denoted by ...
s are included, in two different cohorts).
Encoding of decimal128 values
The
IEEE 754
The IEEE Standard for Floating-Point Arithmetic (IEEE 754) is a technical standard for floating-point arithmetic originally established in 1985 by the Institute of Electrical and Electronics Engineers (IEEE). The standard #Design rationale, add ...
standard allows two alternative encodings for decimal128 values:
* The binary encoding, based on
binary integer decimal (BID): The significand is encoded as an
unsigned integer written in binary.
* The decimal encoding, based on
densely packed decimal (DPD): The significand is encoded as an unsigned integer written in decimal, with groups of 3 digits packed together in a
declet and a special rule for the most significant digit.
This standard does not specify how to signify which encoding is used, for instance in a situation where decimal128 values are communicated between systems.
Both alternatives provide exactly the same set of representable numbers: 34 digits of significand and possible exponent values.
In both cases, the most significant 4 bits of the significand (which actually only have 10 possible values) are combined with the most significant 2 bits of the exponent (3 possible values) to use 30 of the 32 possible values of 5 bits in the combination field. The remaining combinations encode
infinities and
NaNs.
In the case of Infinity and NaN, all other bits of the encoding are ignored. Thus, it is possible to initialize an array to Infinities or NaNs by filling it with a single byte value.
Binary integer significand field
This format uses a binary significand from 0 to = = 1ED09BEAD87C0378D8E63FFFFFFFF
16 =
.
The encoding can represent binary significands up to = but values larger than are illegal (and the standard requires implementations to treat them as 0, if encountered on input).
As described above, the encoding varies depending on whether the most significant 4 bits of the significand are in the range 0 to 7 (0000
2 to 0111
2), or higher (1000
2 or 1001
2).
If the 2 bits after the sign bit are "00", "01", or "10", then the
exponent field consists of the 14 bits following the sign bit, and the
significand is the remaining 113 bits, with an implicit leading 0 bit:
This includes
subnormal numbers where the leading significand digit is 0.
If the 2 bits after the sign bit are "11", then the 14-bit exponent field is shifted 2 bits to the right (after both the sign bit and the "11" bits thereafter), and the represented significand is in the remaining 111 bits. In this case there is an implicit (that is, not stored) leading 3-bit sequence "100" in the true significand.
The "11" 2-bit sequence after the sign bit indicates that there is an ''implicit'' "100" 3-bit prefix to the significand. Compare having an implicit 1 in the significand of normal values for the binary formats. The "00", "01", or "10" bits are part of the exponent field.
For the decimal128 format, all of these significands are out of the valid range (they begin with ), and are thus decoded as zero, but the pattern is same as
decimal32 and
decimal64.
In the above cases, the value represented is
: (−1)
sign × 10
exponent−6176 × significand
If the four bits after the sign bit are "1111" then the value is an infinity or a NaN, as described above:
s 11110 xx...x ±infinity
s 11111 0x...x a quiet NaN
s 11111 1x...x a signalling NaN
Densely packed decimal significand field
In this version, the significand is stored as a series of decimal digits. The leading digit is between 0 and 9 (3 or 4 binary bits), and the rest of the significand uses the
densely packed decimal (DPD) encoding.
The leading 2 bits of the exponent and the leading digit (3 or 4 bits) of the significand are combined into the five bits that follow the sign bit.
This twelve bits after that are the exponent continuation field, providing the less-significant bits of the exponent.
The last 110 bits are the significand continuation field, consisting of eleven 10-bit ''
declets''.
Each declet encodes three decimal digits
[ using the DPD encoding.
If the first two bits after the sign bit are "00", "01", or "10", then those are the leading bits of the exponent, and the three bits after that are interpreted as the leading decimal digit (0 to 7):
If the first two bits after the sign bit are "11", then the second two bits are the leading bits of the exponent, and the last bit is prefixed with "100" to form the leading decimal digit (8 or 9):
The remaining two combinations (11110 and 11111) of the 5-bit field
are used to represent ±infinity and NaNs, respectively.
The DPD/3BCD transcoding for the declets is given by the following table.
b9...b0 are the bits of the DPD, and d2...d0 are the three BCD digits.
The 8 decimal values whose digits are all 8s or 9s have four codings each.
The bits marked x in the table above are ignored on input, but will always be 0 in computed results.
(The non-standard encodings fill in the gap between and .)
In the above cases, with the ''true significand'' as the sequence of decimal digits decoded, the value represented is
:
]
See also
* ISO/IEC 10967
ISO/IEC 10967, Language independent arithmetic (LIA), is a series of
standards on computer arithmetic. It is compatible with ISO/IEC/IEEE 60559:2011,
more known as IEEE 754-2008, and much of the
specifications are for IEEE 754 special values
(tho ...
, Language Independent Arithmetic
* Q notation (scientific notation)
References
{{reflist
Floating point types