| Floating-pointformats |
|---|
| IEEE 754 |
|
| Other |
| Alternatives |
| Tapered floating point |
Incomputing,decimal64 is adecimal floating-pointcomputer number format that occupies 8 bytes (64 bits) in computer memory. The format was formally introduced in the2008 revision[1] of theIEEE 754 standard, also known asISO/IEC/IEEE 60559:2011.[2]
Decimal64 values are categorized as normal orsubnormal (denormal) numbers and can be encoded in eitherbinary integer decimal (BID) ordensely packed decimal (DPD) formats. Normal values can possess 16-digit precision ranging from ±1.000000000000000×10−383 to ±9.999999999999999×10384. In addition to normal and subnormal numbers, the format also includes signed zeros, infinities, andNaNs.
The binary format of identical size accommodates a spectrum from denormal-min ±5×10−324, through normal-min with complete 53-bit precision ±2.2250738585072014×10−308, to maximum ±1.7976931348623157×10+308.
Because thesignificand for theIEEE 754, decimal formats are not normalized and most values with less than 16significant digits have multiple possible representations; 1000000 × 10−2 = 100000 × 10−1 = 10000 × 100 = 1000 × 101 all have the value 10000. These sets of representations for the same value are calledcohorts. The different members can be used to denote how many digits of the value are known precisely. Each signed zero has 768 possible representations (1536 for all zeros, in two different cohorts).
| Sign | Combination | Significand continuation |
|---|---|---|
| 1 bit | 13 bits | 50 bits |
IEEE 754 allows two alternative encodings for decimal64 values. The standard does not specify how to signify which representation is used. For instance, in a situation where decimal64 values are communicated between systems:
Both alternatives provide exactly the same set of representable numbers: 16 digits of significand and3 × 28 = 768 possible decimal exponent values. All the possible decimal exponent values storable in abinary64 number are representable in decimal64, and most bits of the significand of a binary64 are stored keeping roughly the same number of decimal digits in the significand.
In both cases, the most significant 4 bits of the significand, which only have 10 possible values, are combined with two bits of the exponent (3 possible values) to use 30 of the 32 possible values of a 5-bit field. The remaining combinations encodeinfinities andNaNs. BID and DPD use different bits of the combination field.
For Infinity and NaN, all other bits of the encoding are not used. Thus, an array can be filled with a single byte value to set it to Infinities or NaNs.
This format uses a binary significand from 0 to1016 − 1 =9999999999999999 = 2386F26FC0FFFF16 =1000111000011011110010011011111100000011111111111111112.The encoding, completely stored on 64 bits, can represent binary significands up to10 × 250 − 1 =11258999068426239 = 27FFFFFFFFFFFF16, but values larger than1016 − 1 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 significant4 bits of the significand are in the range 0 to 7 (00002 to 01112), or higher (10002 or 10012).
If the two bits after the sign bit are "00", "01", or "10", then the exponent field consists of the10 bits following the sign bit and the significand is the remaining53 bits with an implicit leading0 bit. This includessubnormal numbers where the leading significand digit is 0.
If the2 bits after the sign bit are "11", then the 10-bit exponent field is shifted2 bits to the right (after both the sign bit and the "11" bits thereafter) and the represented significand is in the remaining51 bits. In this case there is an implicit (that is, not stored) leading 3-bit sequence "100" for the MSB bits of the true significand (in the remaining lower bitsttt...ttt of the significand, not all possible values are used).
| Combination Field | Exponent | Significand / Description | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| g12 | g11 | g10 | g9 | g8 | g7 | g6 | g5 | g4 | g3 | g2 | g1 | g0 | |||
| combination field not starting with '11', bits ab = 00, 01 or 10 | |||||||||||||||
| a | b | c | d | m | m | m | m | m | m | e | f | g | abcdmmmmmm | (0)efgtttttttttttttttttttttttttttttttttttttttttttttttttt Finite number with small first digit of significand (0 .. 7). | |
| combination field starting with '11', but not 1111, bits ab = 11, bits cd = 00, 01 or 10 | |||||||||||||||
| 1 | 1 | c | d | m | m | m | m | m | m | e | f | g | cdmmmmmmef | 100gtttttttttttttttttttttttttttttttttttttttttttttttttt Finite number with big first digit of significand (8 or 9). | |
| combination field starting with '1111', bits abcd = 1111 | |||||||||||||||
| 1 | 1 | 1 | 1 | 0 | ±Infinity | ||||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | quiet NaN | |||||||||
| 1 | 1 | 1 | 1 | 1 | 1 | signaling NaN (with payload in significand) | |||||||||
The leading bits of the significand field donot encode the most significant decimal digit; they are simply part of a larger pure-binary number. For example, a significand of8000000000000000 is encoded as binary0111000110101111110101001001100011010000000000000000002 with the leading4 bits encoding 7; the first significand which requires a 54th bit is253 =9007199254740992. The highest valid significant is9999999999999999 whose binary encoding is(100)0111000011011110010011011111100000011111111111111112 (with the 3 most significant bits (100) not stored but implicit as shown above; and the next bit is always zero in valid encodings).
In the above cases, the value represented is
If the four bits after the sign bit are "1111" then the value is an infinity or a NaN, as described above:
0 11110 xx...x +infinity1 11110 xx...x -infinityx 11111 0x...x a quiet NaNx 11111 1x...x a signalling NaN
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 thedensely packed decimal (DPD) encoding.
The leading2 bits of the exponent and the leading digit (3 or4 bits) of the significand are combined into the five bits that follow the sign bit. The eight bits after that are the exponent continuation field, providing the less-significant bits of the exponent. The last50 bits are the significand continuation field, consisting of five 10-bit declets.[3] Eachdeclet encodes three decimal digits[3] using the DPD encoding.
If the initial two bits following the sign bit are "00", "01", or "10", they represent the leading bits of the exponent, whereas the subsequent three bits "cde" are regarded as the leading decimal digit (ranging from 0 to 7):
If the first two bits after the sign bit are "11", then the second 2-bits are the leading bits of the exponent, and the next bit "e" is prefixed with implicit bits "100" to form the leading decimal digit (8 or 9):
The remaining two combinations (11 110 and 11 111) of the 5-bit field after the sign bit are used to represent ±infinity and NaNs, respectively.
| Combination Field | Exponent | Significand / Description | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| g12 | g11 | g10 | g9 | g8 | g7 | g6 | g5 | g4 | g3 | g2 | g1 | g0 | |||
| combination field not starting with '11', bits ab = 00, 01 or 10 | |||||||||||||||
| a | b | c | d | e | m | m | m | m | m | m | m | m | abmmmmmmmm | (0)cde tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt Finite number with small first digit of significand (0 … 7). | |
| combination field starting with '11', but not 1111, bits ab = 11, bits cd = 00, 01 or 10 | |||||||||||||||
| 1 | 1 | c | d | e | m | m | m | m | m | m | m | m | cdmmmmmmmm | 100e tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt Finite number with big first digit of significand (8 or 9). | |
| combination field starting with '1111', bits abcd = 1111 | |||||||||||||||
| 1 | 1 | 1 | 1 | 0 | ±Infinity | ||||||||||
| 1 | 1 | 1 | 1 | 1 | 0 | quiet NaN | |||||||||
| 1 | 1 | 1 | 1 | 1 | 1 | signaling NaN (with payload in significand) | |||||||||
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.
| DPD encoded value | Decimal digits | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Code space (1024 states) | b9 | b8 | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | d2 | d1 | d0 | Values encoded | Description | Occurrences (1000 states) | |
| 50.0% (512 states) | a | b | c | d | e | f | 0 | g | h | i | 0abc | 0def | 0ghi | (0–7) (0–7) (0–7) | 3 small digits | 51.2% (512 states) | |
| 37.5% (384 states) | a | b | c | d | e | f | 1 | 0 | 0 | i | 0abc | 0def | 100i | (0–7) (0–7) (8–9) | 2 small digits, 1 large digit | 38.4% (384 states) | |
| a | b | c | g | h | f | 1 | 0 | 1 | i | 0abc | 100f | 0ghi | (0–7) (8–9) (0–7) | ||||
| g | h | c | d | e | f | 1 | 1 | 0 | i | 100c | 0def | 0ghi | (8–9) (0–7) (0–7) | ||||
| 9.375% (96 states) | g | h | c | 0 | 0 | f | 1 | 1 | 1 | i | 100c | 100f | 0ghi | (8–9) (8–9) (0–7) | 1 small digit, 2 large digits | 9.6% (96 states) | |
| d | e | c | 0 | 1 | f | 1 | 1 | 1 | i | 100c | 0def | 100i | (8–9) (0–7) (8–9) | ||||
| a | b | c | 1 | 0 | f | 1 | 1 | 1 | i | 0abc | 100f | 100i | (0–7) (8–9) (8–9) | ||||
| 3.125% (32 states, 8 used) | x | x | c | 1 | 1 | f | 1 | 1 | 1 | i | 100c | 100f | 100i | (8–9) (8–9) (8–9) | 3 large digits, b9, b8: don't care | 0.8% (8 states) | |
The 8 decimal values whose digits are all 8s or 9s have four codings each. The bits marked x in the table above areignored on input, but will always be 0 in computed results. The8 × 3 = 24 non-standard encodings fill in the gap between103 = 1000 and 210 = 1024.
In the above cases, with thetrue significand as the sequence of decimal digits decoded, the value represented is
This sectiondoes notcite anysources. Please helpimprove this section byadding citations to reliable sources. Unsourced material may be challenged andremoved.(November 2025) (Learn how and when to remove this message) |
There are multiple libraries available for calculations with decimal data types. Some examples are listed below:
UINTxx items nameddecimalxx. The library improves performance by calculating more intricate functions in binary where possible, but this introduces some binary rounding errors into decimal calculations.decSingle,decDouble, anddecQuad. It efficiently performs conversions between decimal numbers and strings.data, anddata itself.Data is stored as an array of two or more words, which holds the coefficient in 32-bit (9-digit) or 64-bit (19-digit) items. The library can handle a wide range of inputs and produces accurate results. It is implemented inPython as thedecimal module.{{cite book}}: CS1 maint: numeric names: authors list (link)