Content deleted Content added
Undid revision 328793080 by 88.205.141.131 (talk) The significand defined as a positive INTEGER, so the bias is -398. Tag: Non-autoconfirmed user rapidly reverting edits |
Adapted (better) Decimal32 article. |
||
Line 1:
{{floating-point}}
In [[computing]], '''decimal64''' is a decimal [[floating-point]] [[computer numbering format]] that occupies 8 bytes (64 bits) in computer memory.
It is intended for applications where it is necessary to emulate decimal rounding exactly, such as financial and tax computations.
Decimal64 supports 16 [[decimal digit]]s of [[significand]] and an [[exponent]] range of −383 to +384, i.e. ±0.000000000000000×10<sup>−383</sup> to ±9.999999999999999×10<sup>384</sup>. (Equivalently, ±0,000,000,000,000,000×10<sup>−398</sup> to ±9,999,999,999,999,999×10<sup>369</sup>.) Because the significand is not normalized, most values with less than 16 [[significant digits]] have multiple possible representations; 1×10<sup>2</sup>=0.1×10<sup>3</sup>=0.01×10<sup>4</sup>, etc. Zero has 768 possible representations (1536 if you include both [[signed zero]]s).
Decimal64 floating point is a relatively new decimal floating-point format, formally introduced in the 2008 version of [[IEEE 754]].
== Representation of decimal64 values ==
IEEE 754 allows two alternative representation methods for
The standard does not specify how to signify which representation is used,
for instance in a situation where decimal64 values are communicated between systems.
In one representation method, based on [[binary integer decimal]],
the
The other, alternative, representation method is based on
Line 18 ⟶ 20:
significand (except the most significant digit).
Both alternatives provide exactly the same range of representable numbers: 16 digits of significand and 3×2<sup>8</sup> = 768 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 a 5-bit field. The remaining combinations encode [[infinity|infinities]] and [[NaN]]s.
If the leading 4 bits of the significand is between 0 and 7, the number begins as follows
s 00 xxxx Exponent begins with 00, significand with 0mmm
s 01 xxxx Exponent begins with 01, significand with 0mmm
s 10 xxxx Exponent begins with 10, significand with 0mmm
If the leading 4 bits of the significand are binary 1000 or 1001 (decimal 8 or 9), the number begins as follows:
s 1100 xx Exponent begins with 00, significand with 100m
s 1101 xx Exponent begins with 01, significand with 100m
s 1110 xx Exponent begins with 10, significand with 100m
The following bits (xxx in the above) encode the additional exponent bits and the remainder of the most significant digit, but the details vary depending on the encoding alternative used. There is no particular reason for this difference, other than historical reasons in the eight-year long development of IEEE 754-2008.
The final combinations are used for infinities and NaNs, and are the same for both alternative encodings:
s 11110 x ±Infinity (see [[Extended real number line]])
s 111110 quiet NaN (sign bit ignored)
s 111111 signaling NaN (sign bit ignored)
In the latter cases, all other bits of the encoding are ignored. Thus, it is possible to initialize an array to NaNs by filling it with a single byte value.
=== Binary integer significand field ===
This format uses a binary significand from 0 to 10<sup>16</sup>−1 = 9,999,999,999,999,999 = 2386F26FC0FFFF<sub>16</sub> =
1000 1110000110 1111001001 1011111100 0000111111 1111111111<sub>2</sub>.
The encoding can represent binary significands up to 10×2<sup>50</sup>−1 = 11,258,999,068,426,239 = 27FFFFFFFFFFFF<sub>16</sub>, but values larger than 10<sup>7</sup>−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 significant 4 bits of the significand are in the range 0 to 7 (0000<sub>2</sub> to 0111<sub>2</sub>), or higher (1000<sub>2</sub> or 1001<sub>2</sub>).
If the 2 bits after the sign bit are "00", "01", or "10", then the
exponent field consists of the 10 bits following the sign bit, and the
significand is the remaining 53 bits, with an implicit leading 0 bit:
s 00eeeeeeee (0)TTTtttttttttttttttttt tttttttttttttttttttttttttttttttt
s 01eeeeeeee (0)TTTtttttttttttttttttt tttttttttttttttttttttttttttttttt
s 10eeeeeeee (0)TTTtttttttttttttttttt tttttttttttttttttttttttttttttttt
This includes [[subnormal numbers]] where the leading significand digit is 0.
If the 4 bits after the sign bit are "1100", "1101", or "1110", then the 10-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 51 bits. In this case there is an implicit (that is, not stored) leading 3-bit sequence "100" in the true significand.
s 11 00eeeeeeee (100)Ttttttttttttttttttt tttttttttttttttttttttttttttttttt
s 11 01eeeeeeee (100)Ttttttttttttttttttt tttttttttttttttttttttttttttttttt
s 11 10eeeeeeee (100)Ttttttttttttttttttt tttttttttttttttttttttttttttttttt
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. Note also that the "00", "01", or "10" bits are part of the exponent field.
Note that the leading bits of the significand field do ''not'' encode the most significant decimal digit; they are simply part of a larger pure-binary number. For example, a significand of 8,000,000,000,000,000 is encoded as binary 111 0001101011 1111010100 1001100011 0100000000 0000000000, with the leading 4 bits encoding 7; the first significand which requires a 54th bit is 2<sup>53</sup> = 9,007,199,254,740,992.
In the above cases, the value represented is
: (−1)<sup>sign</sub> × 10<sup>exponent−398</sup> × significand <!-- Remember, significand is defined as an integer: 0 <= significand < 10^16 -->
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 111110 x...x a quiet NaN
s 111111 x...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]] encoding.
Unlike the binary integer significand version, where the exponent changed position and came before the significand, this encoding combines the leading 2 bits of the exponent and the leading digit (3 or 4 bits)
of the
The
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
the leading bits of the exponent, and the three bits after that are interpreted as
the leading decimal digit (0 to 7):
s 00
s 01
s 10
If the 4 bits after the sign bit are "1100", "1101", or "1110", 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):
s 1100
s 1101
s 1110
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.
Line 121:
{{Densely packed decimal}}
The bits marked x in the table above are ignored on input, but will always be 0 in computed results.
(The 8×3 = 24 non-standard encodings fill in the gap between 10<sup>3</sup>=1000 and 2<sup>10</sup>=1024.)
In the above cases, with the ''true significand'' as the sequence of decimal digits decoded, the value represented is
:<math>(-1)^\text{signbit}\times 10^{\text{exponentbits}_2-398_{10}}\times \text{truesignificand}_{10}</math>
== See also ==
|