decimal128 flyttalsformat

Inom databehandling är decimal128 ett decimalt flyttalsformat datornumreringsformat som upptar 16 byte (128 bitar) i datorns minne . Den är avsedd för applikationer där det är nödvändigt att efterlikna decimalavrundning exakt, såsom finansiella och skattemässiga beräkningar.

±0000000000000000000000000000000000×10^−6176 to 9 9 9 9 −6143 till exponentområde 9 ± Decimal128 999 999 999 999 999 × 10 ^ 6144 stöder 34 decimalsiffror med signifikans och ett +6144, dvs. ±0,000 000 000 000 000 000 000 000 000 000 000 × 40 000 × 9 9 9 ± 999 9. 99 . (Tillsvarande, ±9999999999999999999999999999999999× ± ^6111.) Therefore, decimal128 has the greatest range of values compared with other IEEE basic floating-point formats. Because the significand is not normalized, most values with less than 34 significant digits have multiple possible representations; 1 × 102=0.1 × 103=0.01 × 104, etc. Zero has 12288 possible representations (24576 if both signed zeros are included).

Decimal128 flyttal är ett relativt nytt decimal flyttal format, formellt introducerat i 2008 års version av IEEE 754 samt med ISO/IEC/IEEE 60559:2011 .

Representation av decimal128-värden

Skylt Kombination Betydande fortsättning
1 bit 17 bitar 110 bitar
s mmmmmmmmmmmmmmmmm cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

IEEE 754 tillåter två alternativa representationsmetoder för decimal128-värden. Standarden anger inte hur man betecknar vilken representation som används, till exempel i en situation där decimal128-värden kommuniceras mellan system.

I en representationsmetod, baserad på binär heltalsdecimal (BID), representeras signifikanden som binärt kodat positivt heltal.

Den andra, alternativa, representationsmetoden är baserad på tätt packad decimal (DPD) för det mesta av signifikanden (förutom den mest signifikanta siffran).

Båda alternativen ger exakt samma intervall av representativa tal: 34 siffror av signifikans och 3 × 2 12 = 12 288 möjliga exponentvärden.

I båda fallen kombineras de mest signifikanta 4 bitarna av signifikanden (som faktiskt bara har 10 möjliga värden) med de mest signifikanta 2 bitarna av exponenten (3 möjliga värden) för att använda 30 av de 32 möjliga värdena på 5 bitar i kombinationsfält. De återstående kombinationerna kodar oändligheter och NaNs .

Kombinationsfält Exponent Signifikanta Msbits Övrig
00mmmmmmmmmmmmmm 00xxxxxxxxxxxx 0ccc
01mmmmmmmmmmmmmm 01xxxxxxxxxxxx 0ccc
10mmmmmmmmmmmmmm 10xxxxxxxxxxxx 0ccc
1100mmmmmmmmmmmm 00xxxxxxxxxxxx 100c
1101mmmmmmmmmmmm 01xxxxxxxxxxxx 100c
1110mmmmmmmmmmmm 10xxxxxxxxxxxx 100c
11110mmmmmmmmmmmm ±Oändlighet
11111mmmmmmmmmmmm NaN . Tecken bit ignoreras. Sjätte biten i kombinationsfältet bestämmer om NaN signalerar.

I fallet med Infinity och NaN ignoreras alla andra bitar av kodningen. Således är det möjligt att initiera en array till oändligheter eller NaNs genom att fylla den med ett enda bytevärde.

Binärt heltals signifikansfält

Det här formatet använder en binär signifikans från 0 till 10 34 − 1 = 9 999 999 999 999 999 999 999 999 999 999 999 0000000011 = 1ED09BEAD87C0378D8E63 FFFFFFFF 111 110106 =011006 1111 1010101101 1000011111 0111100011 0110001110 0110001111 1111111111 1111111111 111 = 01100 . Kodningen kan representera binära signifikander upp till 10 × 2 110 − 1 = 12 980 742 146 337 069 071 326 240 823 050 239 men värden som är större än 10 34 − 1 är olagliga (och om standardimplementering krävs) påträffas vid inmatning).

Såsom beskrivits ovan varierar kodningen beroende på huruvida de mest signifikanta 4 bitarna av signifikanden är i intervallet 0 till 7 (00002 till 01112 ) eller högre (10002 eller 10012 ) .

Om de 2 bitarna efter teckenbiten är "00", "01" eller "10", så består exponentfältet av de 14 bitarna som följer efter teckenbiten, och signifikanden är de återstående 113 bitarna, med en implicit inledande 0 bit:

s 00eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 01eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 10eeeeeeeeeeee (0)ttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

Detta inkluderar subnormala tal där den ledande signifikanssiffran är 0.

Om de 2 bitarna efter teckenbiten är "11", så flyttas 14-bitars exponentfältet 2 bitar åt höger (efter både teckenbiten och de "11" bitarna därefter), och den representerade signifikansen är i den återstående 111 bitar. I detta fall finns det en implicit (det vill säga inte lagrad) ledande 3-bitars sekvens "100" i den sanna signifikansen.

s 1100eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1101eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt s 1110eeeeeeeeeeee (100)t tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt tttttttttt

"11" 2-bitarssekvensen efter teckenbiten indikerar att det finns ett implicit "100" 3-bitars prefix till signifikanden. Jämför att ha en implicit 1 i signifikansen för normala värden för de binära formaten. "00", "01" eller "10" bitarna är en del av exponentfältet.

För decimal128-formatet är alla dessa signifikander utanför det giltiga intervallet (de börjar med 2 113 > 1,038 × 10 34 ), och avkodas alltså som noll, men mönstret är detsamma som decimal32 och decimal64 .

I ovanstående fall är det representerade värdet

(−1) tecken × 10 exponent−6176 × signifikans

Om de fyra bitarna efter teckenbiten är "1111" är värdet en oändlighet eller en NaN, enligt beskrivningen ovan:

s 11110 xx...x ±oändlighet s 11111 0x...xa tyst NaN s 11111 1x...xa signalerande NaN

Tätt packat decimal signifikansfält

I den här versionen lagras signifikanden som en serie decimalsiffror. Den inledande siffran är mellan 0 och 9 (3 eller 4 binära bitar), och resten av signifikanden använder den tätt packade decimalkodningen (DPD).

De två inledande bitarna av exponenten och den inledande siffran (3 eller 4 bitar) av signifikanden kombineras till de fem bitarna som följer teckenbiten.

Dessa tolv bitar efter det är exponentens fortsättningsfält, vilket ger exponentens mindre signifikanta bitar.

De sista 110 bitarna är det signifikanta fortsättningsfältet, bestående av elva 10-bitars dekleter . Varje declet kodar tre decimalsiffror med hjälp av DPD-kodningen.

Om de två första bitarna efter teckenbiten är "00", "01" eller "10", så är dessa exponentens inledande bitar, och de tre bitarna efter det tolkas som den inledande decimalsiffran (0 till 7) ):

s 00 TTT (00)eeeeeeeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tt ttttttttt] eTT (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 10 TTT (10)eeeeeeeeTTtttt)[tt (0 tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]

Om de två första bitarna efter teckenbiten är "11", så är de andra två bitarna exponentens ledande bitar, och den sista biten har prefixet "100" för att bilda den inledande decimalsiffran (8 eller 9):

s 1100 T (00)eeeeeeeeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttttt][etttttttt1][etttt1)ee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt] s 1110 T (10)eeeeeeeeeeeeee[tttttttt] tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]

De återstående två kombinationerna (11110 och 11111) av 5-bitarsfältet används för att representera ±oändlighet respektive NaNs.

DPD/3BCD-omkodningen för dekleten ges av följande tabell. b9...b0 är bitarna i DPD, och d2...d0 är de tre BCD-siffrorna.

Tätt packade decimalkodningsregler
DPD-kodat värde Decimalsiffror
Kodutrymme (1024 stater) b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d2 d1 d0 Värden kodade Beskrivning Förekomster (1 000 tillstånd)
50,0 % (512 delstater) a b c d e f 0 g h i 0abc 0def 0ghi (0–7) (0–7) (0–7) Tre små siffror 51,2 % (512 delstater)
37,5 % (384 delstater) a b c d e f 1 0 0 i 0abc 0def 100 i (0–7) (0–7) (8–9)
Två små siffror, en stor
38,4 % (384 delstater)
a b c g h f 1 0 1 i 0abc 100 f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i 100 c 0def 0ghi (8–9) (0–7) (0–7)
9,375 % (96 delstater) g h c 0 0 f 1 1 1 i 100 c 100 f 0ghi (8–9) (8–9) (0–7)
En liten siffra, två stora
9,6 % (96 delstater)
d e c 0 1 f 1 1 1 i 100 c 0def 100 i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i 0abc 100 f 100 i (0–7) (8–9) (8–9)
3,125 % (32 delstater, 8 använda) x x c 1 1 f 1 1 1 i 100 c 100 f 100 i (8–9) (8–9) (8–9) Tre stora siffror, bitarna b9 och b8 bryr sig inte 0,8 % (8 delstater)

De 8 decimalvärdena vars siffror alla är 8:or eller 9:or har fyra koder vardera. Bitarna markerade x i tabellen ovan ignoreras vid inmatning, men kommer alltid att vara 0 i beräknade resultat. ( 8 × 3 = 24 icke-standardkodningar fyller ut gapet mellan 10 3 = 1000 och 2 10 = 1024 .)

I ovanstående fall, med den sanna signifikansen som sekvensen av decimalsiffror avkodad, är det representerade värdet

Se även