Nombre dénormaliséLa notion de nombre dénormalisé intervient dans la représentation des nombres en informatique par la méthode de la virgule flottante, telle que normalisé par la norme IEEE 754. C'est une manière de représenter des nombres ayant une valeur très proche de zéro. PrérequisLa représentation en virgule flottante pour les ordinateurs est fondée sur deux notions : la notation scientifique et le système binaire (ou base 2). Pour écrire les nombres en base 10, on peut utiliser la notation dite « scientifique », qui comprend deux parties :
sous la forme « n × 10a ». Par exemple :
Le terme « exposant » correspond à la puissance de 10, et le terme mantisse correspond à la partie décimale. Ainsi, dans « 1,23 × 10−2 »,
Le système binaire, dit aussi « base 2 », est une manière de noter les nombres ne faisant intervenir que deux chiffres, 0 et 1. Il est bien adapté à l'électronique, puisque cela correspond à deux états bien distincts : on a aux bornes d'un composant une tension V0 ou une tension V1 (« le courant ne passe pas ou le courant passe »). Pour distinguer cette notation de la notation décimale, nous ajoutons ici un « b » à la fin du nombre. Voici quelques exemples de nombres :
Un nombre binaire à virgule de quatre chiffres n1n0,n-1n-2b correspond au nombre décimal n1 × 21 + n0 × 20 + n-1 × 2-1 + n-2 × 2-2. On peut ainsi avoir une notation scientifique binaire :
par exemple
Dans le cas de la notation scientifique binaire, le nombre à virgule doit être compris entre 1b inclus et 10b exclus (c'est-à-dire 2 exclus), c'est-à-dire que sa partie entière est nécessairement 1b. Représentation d'un nombre normaliséSelon ladite norme, la représentation d'un nombre réel peut se décomposer en trois parties :
La valeur du nombre représenté vaut :
En effet, en notation scientifique en base binaire, la partie entière est nécessairement 1, il est donc inutile d'utiliser un bit pour la représenter, on se contente de représenter la partie fractionnaire. Représentation d'un nombre dénormaliséUn nombre est dit dénormalisé lorsque
Si l'on suivait la même représentation que pour les nombres à exposant non nul, on aurait
mais la valeur retenue est
c'est-à-dire que pour un exposant codé sur 8 bits (représentation dite à simple précision), on a
et que pour un exposant codé sur 11 bits (représentation dite à double précision), on a
Raison de cette représentationAvec les nombres dénormalisés, on abandonne la notation scientifique. Si la mantisse correspond à 0,1b (le « b » signifie que l'on est en mode binaire, en base deux), alors :
on voit ainsi que le plus petit nombre représentable de manière normalisée est 1,000…00b × 2-décalage (puisqu'une mantisse nulle et un exposant nul servent à représenter le zéro), alors qu'en représentation dénormalisée, c'est 0,000…01b × 2-décalage. On peut donc représenter des nombres plus petits. Cela assure également une continuité avec les nombres normalisés, puisque :
soit un « saut » de 0,000…01b × 2-décalage + 1 Nous avons donc, en simple précision :
Impact sur les performancesCertaines architectures réalisent des opérations sur les nombres dénormalisés au niveau matériel, cependant il est possible que ces opérations soient effectuées au niveau logiciel. Cela peut avoir pour conséquence de créer des ralentissements conséquents. Il est possible de demander au processeur de traiter ces nombres au niveau matériel en les ramenant à 0 soit Flush-To-Zero (FTZ) et Denormals-Are-Zero (DAZ). Il faut pour cela activer les bons registres : sur x86_64: #if defined(_x86-64)
asm("stmxcsr -0x4(%rsp)\n\t" /* stock le registre CSR sur la pile */
"orl $0x8040, -0x4(%rsp)\n\t" /* modifie la valeur des bits 15( FTZ ) and 7( DAZ ) */
"ldmxcsr -0x4(%rsp)" ); /* charge le registre CSR depuis la pile */
#endif
sur Aarch64: #if defined(__arm64__) || defined(__aarch64__)
uint64_t fpcr;
asm("mrs %0, fpcr" : "=r"( fpcr )); /* Charge le registre FPCR */
asm("msr fpcr, %0" :: "r"( fpcr | (1 << 24) )); /* Modifie la valeur du 24eme bit (FTZ) */
#endif
Voir aussiLiens externes
|