
En informatique , les nombres sous-normaux sont le sous-ensemble des nombres dénormalisés (parfois appelés dénormalisés ) qui comblent l' écart de dépassement négatif autour de zéro en arithmétique à virgule flottante . Tout nombre non nul dont la valeur absolue est inférieure à celle du plus petit nombre normal positif est sous-normal , tandis que terme dénormalisé peut également désigner des nombres en dehors de cet
la première version de la norme IEEE 754 (1985) et la première version standard du langage C (1989) ), le terme « dénormal » désigne exclusivement les nombres sous-normaux. Cet usage persiste dans diverses normes, en particulier lorsqu'il est question de matériel incapable de représenter d'autres nombres dénormalisés. Cependant, le présent document utilise le terme « sous-normal », conformément à la révision de 2008 de la norme IEEE 754. Dans le langage courant, les termes « sous-normal » et « dénormal » sont souvent employés indifféremment, notamment parce qu'il n'existe l’arithmétique à virgule flottante pour plus de détails sur la relation entre les nombres réels et leurs représentations à virgule flottante. On peut utiliser le terme « représentation » plutôt que « nombre » lorsque cela est nécessaire pour plus de clarté.Définition
Les nombres réels mathématiques peuvent être approchés par plusieurs représentations à virgule flottante. Une représentation est dite normale , et les autres sont dites sous-normales , dénormales ou anormales selon leur relation avec la représentation normale .
Dans une valeur à virgule flottante classique , la mantisse (ou significande ) ne comporte pas de zéros non significatifs ; ces zéros sont supprimés en ajustant l’exposant (par exemple, le nombre 0,0123 s’écrirait 0,0123).à virgule flottante IEEE représente ses chiffres significatifs . Pour un nombre normalisé positif, elle peut être représentée par m <sub>0 </sub> , m <sub>1 </sub>, m <sub>2</sub> , m <sub>3</sub> , ..., m<sub>p-2</sub>, m <sub> p - 1 </sub> (où m représente un chiffre significatif et p la précision), avec m <sub> 0 </sub> non nul . Notez que pour une base binaire , le premier chiffre significatif est toujours 1. Dans un nombre sous-normal, l'exposant étant minimal, le premier chiffre significatif est 0 (0, m <sub>1</sub> , m <sub>2</sub> , m <sub> 3</sub> , ... , m <sub>p -2</sub> , m <sub>p- 1</sub> ), ce qui permet de représenter des nombres plus proches de zéro que le plus petit nombre normal. Un nombre à virgule flottante est dit sous-normal lorsque son exposant atteint sa plus petite valeur possible.
En comblant ainsi l'écart de sous-dépassement, des chiffres significatifs sont perdus, mais pas aussi brutalement qu'avec la méthode de mise à zéro en cas de sous-dépassement (qui supprime tous les chiffres significatifs lorsque le sous-dépassement est atteint). C'est pourquoi la production d'un nombre inférieur à la normale est parfois appelée sous-dépassement progressif : elle permet à un calcul de perdre lentement en précision lorsque le résultat est petit.
La norme IEEE 754-2008 prend en charge les nombres sous-normaux aux formats binaire et décimal. En binaire, ces nombres sont codés avec un exposant biaisé de 0, mais interprétés avec la valeur du plus petit exposant autorisé, soit 1 de plus (comme s'ils étaient codés par 1). En décimal, aucun codage particulier n'est requis, car le format prend directement en charge les nombres non normalisés.
Mathématiquement parlant, les nombres à virgule flottante normalisés d'un signe donné sont approximativement logarithmiquement espacés, et de ce fait, aucun nombre à virgule flottante normal de taille finie ne peut contenir zéro . Les nombres à virgule flottante sous-normaux forment un ensemble de valeurs linéairement espacées, couvrant l'intervalle entre les nombres à virgule flottante normaux négatifs et positifs.
Arrière-plan
Les nombres sous-normaux garantissent que l'addition et la soustraction de nombres à virgule flottante ne provoquent jamais de dépassement de capacité négatif ; deux nombres à virgule flottante proches ont toujours une différence non nulle représentable. Sans dépassement de capacité négatif progressif, la soustraction a − b peut provoquer un dépassement de capacité négatif et produire zéro même si les valeurs ne sont pas égales. Ceci peut, à son tour, entraîner des erreurs de division par zéro qui ne peuvent pas se produire lorsque le dépassement de capacité négatif progressif est utilisé.
Les nombres sous-normaux ont été implémentés dans le processeur Intel 8087 lors de la rédaction de la norme IEEE 754. Ils constituaient de loin la fonctionnalité la plus controversée de la proposition de format KCS finalement adoptée , mais cette implémentation a démontré la faisabilité de la prise en charge des nombres sous-normaux. Certaines implémentations d' unités de calcul en virgule flottante ne prennent pas directement en charge les nombres sous-normaux au niveau matériel, mais font appel les formats binaires à virgule flottante IEEE , les nombres sous-normaux sont représentés par un exposant nul et une mantisse non nulle. Selon cette norme, l'existence de nombres sous-normaux permet de représenter certaines valeurs non nulles avec une valeur absolue comprise entre 0 et 1.
Il n'existe pas d'autres nombres dénormalisés dans les formats binaires à virgule flottante de l'IEEE, mais ils les instructions impliquant des opérandes subnormaux peuvent nécessiter jusqu'à 100 cycles d'horloge supplémentaires, ce qui ralentit l'exécution des instructions les plus rapides d'un facteur six.
Cette différence de vitesse peut constituer un risque pour la sécurité. Des chercheurs ont démontré qu'elle crée une faille temporelle permettant à un site web malveillant d'extraire le contenu d'une page d'un autre site directement dans un navigateur web.
Certaines applications nécessitent du code pour éviter les valeurs aberrantes, soit pour préserver la précision, soit pour éviter une perte de performance sur certains processeurs. Par exemple, dans les applications de traitement audio , les valeurs aberrantes représentent généralement un signal si faible qu'il est inaudible pour l'oreille humaine. C'est pourquoi, sur les processeurs où une perte de performance serait inévitable, une mesure courante pour éviter les valeurs aberrantes consiste à annuler le signal dès qu'il atteint un niveau aberrant ou à y ajouter un bruit de fond extrêmement faible. D'autres méthodes permettent d'éviter les valeurs aberrantes, comme l'ajout d'une composante continue , la quantificationSSE2 , Intel intègre cette fonctionnalité dans le matériel du processeur, qui arrondit les valeurs aberrantes à zéro.
Désactivation des nombres flottants inférieurs à la normale au niveau du codede code SSELes compilateurs Clang et GCC ont des valeurs par défaut différentes selon la plateforme et le niveau d'optimisation.Une méthode non conforme à la norme C99 permettant d'activer les indicateurs Mac OS X depuis au moins 2006.
ABI ; par conséquent, un logiciel bien conçu doit sauvegarder et restaurer le mode de dénormalisation avant de retourner à l'appelant ou d'appeler du code dans d'autres bibliothèques.BRAS
Sur les architectures ARM, la gestion des nombres à virgule flottante inférieurs à la normale dépend de la configuration de l'unité à virgule flottante, certaines implémentations prenant en charge le sous-dépassement progressif au niveau matériel tandis que d'autres optent par défaut pour un comportement de vidage à zéro pour des raisons de performance.
L'unité de calcul en virgule flottante NEON (SIMD) AArch32 utilise toujours un mode de vidage à zéro, ce qui est identique à : "=r" ( fpcr )); //Chargement du registre FPCR asm ( "msr fpcr, %0" :: "r" ( fpcr | ( 1 << 24 ) )); //Mise à 1 du 24e bit (FTZ) #endif
Certains processeurs ARM disposent d'une gestion matérielle des valeurs aberrantes.
Une méthode non conforme à la norme C99 permettant d'activer les indicateurs Mac OS X depuis au moins 2006.
BRAS
Sur les architectures ARM, la gestion des nombres à virgule flottante inférieurs à la normale dépend de la configuration de l'unité à virgule flottante, certaines implémentations prenant en charge le sous-dépassement progressif au niveau matériel tandis que d'autres optent par défaut pour un comportement de vidage à zéro pour des raisons de performance.
L'unité de calcul en virgule flottante NEON (SIMD) AArch32 utilise toujours un mode de vidage à zéro, ce qui est identique à : "=r" ( fpcr )); //Chargement du registre FPCR asm ( "msr fpcr, %0" :: "r" ( fpcr | ( 1 << 24 ) )); //Mise à 1 du 24e bit (FTZ) #endif
Certains processeurs ARM disposent d'une gestion matérielle des valeurs aberrantes.