In computing, decimal32 is a decimal floating-point computer numbering format that occupies 4 bytes (32 bits) in computer memory.
Like the binary16 and binary32 formats, decimal32 uses less space than the actually most common format binary64.
decimal32 supports 'normal' values, which can have 7 digit precision from ±1.000000×10^−95 up to ±9.999999×10^+96, plus 'subnormal' values with ramp-down relative precision down to ±1.×10^−101 (one digit), signed zeros, signed infinities and NaN (Not a Number). The encoding is somewhat complex, see below.
The binary format with the same bit-size, binary32, has an approximate range from subnormal-minimum ±1×10^−45 over normal-minimum with full 24-bit precision: ±1.1754944×10^−38 to maximum ±3.4028235×10^38.
decimal32 values are encoded in a 'not normalized' near to 'scientific format', with combining some bits of the exponent with the leading bits of the significand in a 'combination field'.
Besides the special cases infinities and NaNs there are four points relevant to understand the encoding of decimal32.
both produce the same result [2019 version[1] of IEEE 754 in clause 3.3, page 18]. Both applies to BID as well as DPD encoding. For decimalxxx datatypes the second view is more common, while for binaryxxx datatypes the first, the biases are different for each datatype.)
In all cases for decimal32, the value represented is
Alternatively it can be understood as (−1)sign × 10exponent−95 × significand with the significand digits understood as d0 . d−1 d−2 d−3 d−4 d−5 d−6, note the radix dot making it a fraction.
For ±Infinity, besides the sign bit, all the remaining bits are ignored (i.e., both the exponent and significand fields have no effect). For NaNs the sign bit has no meaning in the standard, and is ignored. Therefore, signed and unsigned NaNs are equivalent, even though some programs will show NaNs as signed. The bit m5 determines whether the NaN is quiet (0) or signaling (1). The bits of the significand are the NaN's payload and can hold user defined data (e.g., to distinguish how NaNs were generated). Like for normal significands, the payload of NaNs can be either in BID or DPD encoding.
Be aware that the bit numbering used in the tables for e.g. m10 … m0 is in opposite direction than that used in the document for the IEEE 754 standard G0 … G10.
The resulting 'raw' exponent is a 8 bit binary integer where the leading bits are not '11', thus values 0 ... 10111111b = 0 ... 191d, appr. bias is to be subtracted. The resulting significand could be a positive binary integer of 24 bits up to 1001 1111111111 1111111111b = 10485759d, but values above 107 − 1 = 9999999 = 98967F16 = 1001100010010110011111112 are 'illegal' and have to be treated as zeroes. To obtain the individual decimal digits the significand has to be divided by 10 repeatedly.
The resulting 'raw' exponent is a 8 bit binary integer where the leading bits are not '11', thus values 0 ... 10111111b = 0 ... 191d, appr. bias is to be subtracted. The significand's leading decimal digit forms from the (0)cde or 100e bits as binary integer. The subsequent digits are encoded in the 10 bit 'declet' fields 'tttttttttt' according the DPD rules (see below). The full decimal significand is then obtained by concatenating the leading and trailing decimal digits.
The 10-bit DPD to 3-digit BCD 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. Be aware that the bit numbering used here for e.g. b9 … b0 is in opposite direction than that used in the document for the IEEE 754 standard b0 … b9, add. the decimal digits are numbered 0-base here while in opposite direction and 1-based in the IEEE 754 paper. The bits on white background are not counting for the value, but signal how to understand / shift the other bits. The concept is to denote which digits are small (0 … 7) and encoded in three bits, and which are not, then calculated from a prefix of '100', and one bit specifying if 8 or 9.
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 8 × 3 = 24 non-standard encodings fill in the gap from 103 = 1000 and 210 - 1 = 1023.)
Benefit of this encoding is access to individual digits by de- / encoding only 10 bits, disadvantage is that some simple functions like sort and compare, very frequently used in coding, do not work on the bit pattern but require decoding to decimal digits (and evtl. re-encode to binary integers) first.
An alternate encoding in short BID sections, 10 bits declets encoding 0d ... 1023d and simply using only the range from 0 to 999, would provide the same functionality, direct access to digits by de- / encoding 10 bits, with near zero performance penalty in modern systems, and preserve the option for bit-pattern oriented sort and compare, but the 'Sudoku encoding' shown above was chosen in history, may provide better performance in hardware implementations, and now 'is as it is'.
decimal32 has been introduced in the 2008 version[3] of IEEE 754, adopted by ISO as ISO/IEC/IEEE 60559:2011.[4]
DPD encoding is relatively efficient, not wasting more than about 2.4 percent of space vs. BID, because the 210 = 1024 possible values in 10 bit is only little more than what is used to encode all numbers from 0 to 999.
Zero has 192 possible representations (384 when both signed zeros are included).
The gain in range and precision by the 'combination encoding' evolves because the taken 2 bits from the exponent only use three states, and the 4 MSBs of the significand stay within 0000 … 1001 (10 states). In total that is 3 × 10 = 30 possible states when combined in one encoding, which is representable in 5 bits ( 2 5 = 32 {\displaystyle 2^{5}=32} ).[clarification needed]
The decimal formats include denormal values, for a graceful degradation of precision near zero, but in contrast to the binary formats they are not marked / do not need a special exponent, in decimal32 they are just values too small to have full 7 digit precision even with the smallest exponent.[clarification needed]
In the cases 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.[citation needed]