format à virgule flottante decimal64 - decimal64 floating-point format

En informatique , decimal64 est un format de numérotation informatique à virgule flottante décimale qui occupe 8 octets (64 bits) dans la mémoire de l'ordinateur. Il est destiné aux applications où il est nécessaire d'émuler exactement l'arrondi décimal, telles que les calculs financiers et fiscaux.

Decimal64 prend en charge 16 chiffres décimaux de significande et une plage d' exposants de −383 à +384, c'est-à-dire ±0,000 000 000 000 000 × 10 −383^ à ±9,999 999 999 999 999 × 10 384^ . (Équivalent, ±0 000 000 000 000 000 × 10 −398^ à ±9 999 999 999 999 999 × 10 369^ .) En revanche, le format binaire correspondant, qui est le type le plus couramment utilisé, a une plage approximative de ±0,000 000 000 000 001 × 10 −308^ à ±1,797 693 134 862 315 × 10 308^ . Comme la mantisse n'est pas normalisée, la plupart des valeurs avec moins de 16 chiffres significatifs ont plusieurs représentations possibles ; 1 × 10 2 = 0,1 × 10 3 = 0,01 × 10 4 , etc. Le zéro a 768 représentations possibles (1536 si les deux zéros signés sont inclus).

La virgule flottante Decimal64 est un format de virgule flottante décimal relativement nouveau, officiellement introduit dans la version 2008 de IEEE 754 ainsi qu'avec ISO/IEC/IEEE 60559:2011 .

Représentation des valeurs décimales64

Signe Combinaison Suite de l'exposant Suite significative
1 peu 5 bits 8 bits 50 bits
s mmmmm xxxxxxx cccccccccccccccccccccccccccccccccccccccccccccccc

IEEE 754 permet deux méthodes de représentation alternatives pour les valeurs décimales64. La norme ne précise pas comment signifier quelle représentation est utilisée, par exemple dans une situation où les valeurs décimales64 sont communiquées entre les systèmes :

  • Dans la méthode de représentation binaire , la mantisse à 16 chiffres est représentée sous la forme d'un entier positif codé binaire, basé sur un nombre entier décimal binaire (BID).
  • Dans la méthode de représentation décimale , la mantisse à 16 chiffres est représentée sous la forme d'un entier positif codé décimal, basé sur un nombre décimal dense (DPD) avec 5 groupes de 3 chiffres (à l'exception du chiffre le plus significatif codé spécialement) sont chacun représentés en déclets (10 - séquences de bits). C'est assez efficace, car 2 10 = 1024, n'est qu'un peu plus que nécessaire pour toujours contenir tous les nombres de 0 à 999.

Les deux alternatives fournissent exactement la même plage de nombres représentables : 16 chiffres de mantisse et 3 × 2 8  = 768 valeurs d'exposant décimal possibles. (Toutes les valeurs d'exposant décimal pouvant être stockées dans un nombre binaire64 sont représentables en décimal64, et la plupart des bits de la mantisse d'un binaire64 sont stockés en conservant à peu près le même nombre de chiffres décimaux dans la mantisse.)

Dans les deux cas, les 4 bits les plus significatifs de la mantisse (qui n'ont en réalité que 10 valeurs possibles) sont combinés avec les 2 bits les plus significatifs de l'exposant (3 valeurs possibles) pour utiliser 30 des 32 valeurs possibles d'un 5 bits domaine. Les combinaisons restantes codent des infinis et des NaNs .

Champ de combinaison Exposant Msbits Significand Msbits Autre
00mm 00 0xxx -
01mm 01 0xxx -
10 mm dix 0xxx -
1100m 00 100x -
1101m 01 100x -
1110m dix 100x -
11110 - - ±Infini
11111 - - NaN. Bit de signe ignoré. Le premier bit du champ de continuation de l'exposant détermine si NaN signale.

Dans les cas d'Infinity et de NaN, tous les autres bits du codage sont ignorés. Ainsi, il est possible d'initialiser un tableau à Infinities ou NaNs en le remplissant d'une valeur d'un seul octet.

Champ de significande d'entier binaire

Ce format utilise une  mantisse binaire de 0 à 10 16  − 1 = 9 999 999 999 999 999 = 2386F26FC0FFFF 16  = 1000 1110000110 1111001001 1011111100 0000111111 1111111111 2 .

L'encodage, entièrement stocké sur 64 bits, peut représenter des significandes binaires jusqu'à 10 × 2 50  − 1 = 11 258 999 068 426 239  = 27FFFFFFFFFFFF 16 , mais les valeurs supérieures à 10 16  − 1 sont illégales (et la norme exige des implémentations pour traiter eux comme 0, s'ils sont rencontrés en entrée).

Comme décrit ci-dessus, le codage varie selon que les 4 bits de poids fort de la mantisse sont compris entre 0 et 7 (0000 2 à 0111 2 ), ou supérieur (1000 2 ou 1001 2 ).

Si les 2 bits après le bit de signe sont "00", "01" ou "10", alors le champ exposant se compose des 10 bits suivant le bit de signe, et la mantisse est les 53 bits restants, avec un 0 implicite de tête bit:

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

Cela inclut les nombres sous-normaux où le premier chiffre de significande est 0.

Si les 2 bits après le bit de signe sont "11", alors le champ exposant de 10 bits est décalé de 2 bits vers la droite (après à la fois le bit de signe et les bits "11" par la suite), et la mantisse représentée est dans le reste 51 bits. Dans ce cas, il y a une séquence de 3 bits "100" implicite (c'est-à-dire non stockée) pour la plupart des bits de la vraie mantisse (dans les bits inférieurs restants ttt...ttt de la mantisse, toutes les valeurs possibles ne sont pas utilisé).

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

La séquence de 2 bits "11" après le bit de signe indique qu'il y a un préfixe implicite de 3 bits "100" à la mantisse. Comparez avoir un préfixe 1 bit implicite "1" dans la mantisse des valeurs normales pour les formats binaires. Les séquences de 2 bits "00", "01" ou "10" après le bit de signe font partie du champ exposant.

Les bits de tête du champ significande ne codent pas le chiffre décimal le plus significatif ; ils font simplement partie d'un nombre purement binaire plus grand. Par exemple, une mantisse de 8 000 000 000 000 000 est codée en binaire 0111 0001101011 1111010100 1001100011 0100000000 0000000000 2 , avec les 4 bits de tête 7; le premier significand qui nécessite un 54ème bit est 2 53  = 9 007 199 254 740 992 . Le plus fort significatif valide est 9 999 999 999 999 999 dont le codage binaire est (100)0 1110000110 1111001001 1011111100 0000111111 1111111111 2 (avec les 3 bits les plus significatifs (100) non stockés mais implicites comme indiqué ci-dessus ; et le bit suivant est toujours zéro dans des encodages valides).

Dans les cas ci-dessus, la valeur représentée est

(−1) signe  × 10 exposant−398  × significande

Si les quatre bits après le bit de signe sont « 1111 », alors la valeur est un infini ou un NaN, comme décrit ci-dessus :

s 11110 xx...x    ±infinity
s 11111 0x...x    a quiet NaN
s 11111 1x...x    a signalling NaN

Champ de significande décimal dense

Dans cette version, la mantisse est stockée sous la forme d'une série de chiffres décimaux. Le premier chiffre est compris entre 0 et 9 (3 ou 4 bits binaires), et le reste de la mantisse utilise le codage décimal dense (DPD).

Les 2 bits de tête de l'exposant et le chiffre de tête (3 ou 4 bits) de la mantisse sont combinés dans les cinq bits qui suivent le bit de signe.

Ces huit bits après cela sont le champ de continuation de l'exposant, fournissant les bits les moins significatifs de l'exposant.

Les 50 derniers bits sont le champ de continuation de la mantisse , composé de cinq déclets de 10 bits . Chaque déclet code trois chiffres décimaux en utilisant le codage DPD.

Si les deux premiers bits après le bit de signe sont "00", "01" ou "10", alors ce sont les premiers bits de l'exposant, et les trois bits "TTT" après cela sont interprétés comme le premier chiffre décimal ( 0 à 7) :

s 00 TTT (00)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
s 01 TTT (01)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
s 10 TTT (10)eeeeeeee (0TTT)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]

Si les deux premiers bits après le bit de signe sont "11", alors les 2 bits suivants sont les premiers bits de l'exposant, et le prochain bit "T" est préfixé par les bits implicites "100" pour former le premier chiffre décimal ( 8 ou 9):

s 1100 T (00)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
s 1101 T (01)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]
s 1110 T (10)eeeeeeee (100T)[tttttttttt][tttttttttt][tttttttttt][tttttttttt][tttttttttt]

Les deux combinaisons restantes (11 110 et 11 111) du champ de 5 bits après le bit de signe sont utilisées pour représenter respectivement ± l'infini et NaNs.

Le transcodage DPD/3BCD pour les déclets est donné par le tableau suivant. b9...b0 sont les bits du DPD, et d2...d0 sont les trois chiffres BCD.

Règles de codage décimal denses
Valeur codée DPD Chiffres décimaux
Espace de code (1024 états) b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 d2 d1 d0 Valeurs encodées La description Occurrences (1000 états)
50,0% (512 états) une b c e F 0 g h je 0 abc 0 déf 0 ghi (0–7) (0–7) (0–7) Trois petits chiffres 51,2 % (512 États)
37,5% (384 états) une b c e F 1 0 0 je 0 abc 0 déf 100 je (0–7) (0–7) (8–9) Deux petits chiffres,
un grand
38,4% (384 États)
une b c g h F 1 0 1 je 0 abc 100 f 0 ghi (0–7) (8–9) (0–7)
g h c e F 1 1 0 je 100 c 0 déf 0 ghi (8–9) (0–7) (0–7)
9,375% (96 états) g h c 0 0 F 1 1 1 je 100 c 100 f 0 ghi (8–9) (8–9) (0–7) Un petit chiffre,
deux gros
9,6% (96 états)
e c 0 1 F 1 1 1 je 100 c 0 déf 100 je (8–9) (0–7) (8–9)
une b c 1 0 F 1 1 1 je 0 abc 100 f 100 je (0–7) (8–9) (8–9)
3,125% (32 états, 8 utilisés) X X c 1 1 F 1 1 1 je 100 c 100 f 100 je (8–9) (8–9) (8–9) Trois grands chiffres, les bits B9 et B8 sont ne se soucient pas 0,8% (8 états)

Les 8 valeurs décimales dont les chiffres sont tous des 8 ou 9 ont quatre codages chacune. Les bits marqués x dans le tableau ci-dessus sont ignorés en entrée, mais seront toujours à 0 dans les résultats calculés. (Les 8 × 3 = 24 encodages non standard comblent l'écart entre 10 3  = 1000 et 2 10  = 1024.)

Dans les cas ci-dessus, avec la vraie mantisse comme séquence de chiffres décimaux décodée, la valeur représentée est

Voir également

Les références