Qu'est ce qu'un subnormale nombre à virgule flottante?
isnormal() page de référence dit :
Détermine si le nombre à virgule flottante arg est normal, c'est à dire
ni zéro, subnormale, infini, ni NaN.
Un numéro zéro, l'infini ou NaN est clair ce que cela signifie. Mais il dit aussi subnormale. Quand on est un certain nombre subnormale?
- Un nombre est subnormale lorsque l'exposant bits sont à zéro et la mantisse est non nul. Ils sont des nombres compris entre zéro et le plus petit nombre normal. Ils n'ont pas d'implicite leader de 1 dans la mantisse.
- Premiers résultats sur google montre que c'est juste un synonyme pour un nombres dénormalisés: en.wikipedia.org/wiki/Denormal_number
- Il y a un article de Wikipédia qui lui est consacré: en.wikipedia.org/wiki/Denormal_number
- Ok, donc en nombre normal est en fait un numéro normalisé, c'est à dire dans la gamme (0.1, 1.0]? btw Bjorn ce que vous avez accédé dit tout nombre dénormalisé, pas le nombre normal.
- Une notion est parfois mieux expliqué par son contraire, je n'arrive pas à voir votre objection.
- Où est-il dit que les nombres dénormalisés numéros sont à l'opposé d'un nombre normal? Tous les liens dans le commentaire de parler de tout nombre dénormalisé. Désolé si je suis absent quelque chose d'évident, mais je n'avais vraiment aucune idée.
- Deuxième ligne sur Wikipédia: "tout nombre différent de zéro qui est plus petit que le plus petit nombre normal est sous-normal"."
- Je pense que tu veux coller un couple de "positif"s là-bas 🙂
- C'est un wikipedia de devis, n'hésitez pas à corriger la source 😉
- Ne les intéresse pas. Je suis seulement intéressé à ne pas avoir incorrecte des trucs posté ici 🙂
- WTF? Comment peut-il utiliser google pour d'autres personnes? Des Questions sur le site sont à la recherche d'une réponse, non seulement pour l'interlocuteur, mais aussi pour d'autres personnes!
- Juste point de. D'autre part, faire de la recherche et de le relier à sa question aurait donné un bon exemple pour les autres (et je pense que c'est particulièrement vrai pour les haut-représentant des utilisateurs). Aussi, honnêtement, je ne suis pas sûr que le demande (et de répondre à une question à laquelle google va parfaitement viable réponse (copier/coller le titre) que le premier coup est vraiment l'amélioration de l'internet ou tout simplement dupliquer l'information (je ne suis vraiment pas sûr).
- Penser à ce sujet - j'accorde que, si je ne suis pas sûr, je ne devrais pas avoir downvoted.
- Comme je l'ai dit, je ne savais pas tout nombre dénormalisé sont les mêmes que pour un nombre normal 😉
- Et pourtant, maintenant le 2ème coup sur Google (recherche de la “subnormale virgule flottante”) est cette question elle-même.
- Voir cette question pour une discussion en profondeur de denormals et de traiter avec eux: stackoverflow.com/questions/9314534/...
Vous devez vous connecter pour publier un commentaire.
Dans la norme IEEE754, des nombres à virgule flottante sont représentés sous forme binaire notation scientifique, x = M × 2e. Ici M est le mantisse et e est le exposant. Mathématiquement, vous pouvez toujours choisir l'exposant de sorte que 1 ≤ M < 2.* Cependant, depuis l'ordinateur de représentation de l'exposant ne peut avoir qu'une gamme finie, il y a quelques numéros qui sont plus grand que zéro, mais de moins de 1.0 × 2emin. Ces chiffres sont le subnormals ou denormals.
Pratiquement, la mantisse est stocké sans le 1, car il est toujours l'un des principaux 1, sauf pour subnormale numéros (et zéro). Ainsi l'interprétation, c'est que si l'exposant est non-minimale, il y a un implicite leader de 1, et si l'exposant est minime, il n'y en a pas, et le nombre est subnormale.
*) Plus généralement, 1 ≤ M < B pour toute base-B notation scientifique.
isnomal
esttrue
si les 8 bits sont tous nuls etfalse
autrement?001010
, et interprété comme1.001010
.IEEE 754 bases
D'abord, passons en revue les principes de base de la norme IEEE 754 les nombres sont organisés.
Nous allons nous concentrer sur simple précision (32 bits), mais tout peut immédiatement être généralisé à d'autres précisions.
Le format est:
Ou si vous voulez des photos:
Source.
Le signe est simple: 0 est positif, et 1 est négatif à la fin de l'histoire.
L'exposant 8 bits de long, et il en va de 0 à 255.
L'exposant est appelé biaisée, car elle a un décalage de
-127
, par exemple:Le bit de début de la convention
Lors de la conception de la norme IEEE 754, ingénieurs remarqué que tous les nombres, sauf
0.0
, ont un1
en binaire comme le premier chiffreE. g.:
à la fois commencer avec ça ennuyeux
1.
partie.Par conséquent, il serait du gaspillage de laisser ce chiffre prend un peu de précision presque chaque numéro unique.
Pour cette raison, ils ont créé le "bit de début de la convention":
Mais alors, comment traiter avec
0.0
? Eh bien, ils ont décidé de créer une exception:0.0
de sorte que les octets
00 00 00 00
représentent également0.0
, ce qui semble bon.Si nous n'en avons tenu compte de ces règles, puis le plus petit nombre différent de zéro qui peut être représenté serait:
qui ressemble à quelque chose comme cela dans un hex fraction en raison du bit de début de la convention:
où
.000002
est de 22 zéros avec une1
à la fin.Nous ne pouvons pas prendre
fraction = 0
, sinon, ce nombre serait0.0
.Mais alors les ingénieurs, qui avait aussi un sens artistique aiguisé, de la pensée: n'est-ce pas laid? Que nous sauter de droite
0.0
à quelque chose qui n'est même pas une bonne puissance de 2? Ne pourrions-nous pas représenter, même les plus petits numéros en quelque sorte?Subnormale numéros de
Les ingénieurs ont rayé de leur tête pendant un moment, et revint, comme d'habitude, avec une autre bonne idée. Ce qui si nous créons une nouvelle règle:
Cette règle implique immédiatement que le nombre tel que:
est
0.0
, qui est une sorte de élégant que cela signifie une moins la règle à suivre.Donc
0.0
est en fait un subnormale nombre, selon notre définition!Avec cette nouvelle règle, le plus petit non-subnormale nombre est:
qui représente:
Ensuite, la plus grande subnormale nombre est:
égal à:
où
.FFFFFE
est une fois de plus de 23 bits vers la droite de la dot.C'est assez proche de la plus petite à la non-subnormale nombre, ce qui semble sain d'esprit.
Et le plus petit non-zéro subnormale nombre est:
égal à:
qui semble également assez proche de
0.0
!Incapable de trouver une façon sensée pour représenter les nombres plus petits que cela, les ingénieurs ont été heureux, et je suis rentré à la visualisation d'images de chat en ligne, ou peu importe ce qu'ils ont fait dans les années 70 à la place.
Comme vous pouvez le voir, subnormale numéros de faire un compromis entre la précision et de la représentation de la longueur.
Comme l'exemple le plus extrême, le plus petit non-zéro subnormale:
a essentiellement une précision d'un seul bits au lieu de 32 bits. Par exemple, si on divise par deux:
nous fait atteindre
0.0
exactement!Visualisation
C'est toujours une bonne idée d'avoir un géométriques intuition sur ce que nous apprenons, donc voilà.
Si nous traçons la norme IEEE 754 les nombres à virgule flottante sur une ligne pour chaque exposant, il ressemble à quelque chose comme ceci:
À partir de là on peut voir que pour chaque exposant:
*
)Maintenant, laissez-nous arriver à tous le chemin de l'exposant 0.
Sans subnormals, il serait hypothétiquement ressembler à:
Avec subnormals, il ressemble à ceci:
En comparant les deux graphiques, nous voyons que:
subnormals le double de la longueur de la plage de l'exposant
0
, de[2^-127, 2^-126)
à[0, 2^-126)
L'espace entre les flotteurs dans subnormale gamme est la même que pour
[0, 2^-126)
.la gamme
[2^-127, 2^-126)
a la moitié du nombre de points qu'il aurait sans subnormals.De la moitié de ces points pour remplir l'autre moitié de la plage.
la gamme
[0, 2^-127)
a certains points avec subnormals, mais aucun sans.Ce manque de points dans
[0, 2^-127)
n'est pas très élégant, et est la principale raison pour subnormals d'exister!depuis les points sont équidistants:
[2^-128, 2^-127)
a que la moitié des points que[2^-127, 2^-126)
-
[2^-129, 2^-128)
a que la moitié des points que[2^-128, 2^-127)
C'est ce que nous entendons pour dire que subnormals sont un compromis entre la taille et la précision.
Praticable C exemple
Maintenant, nous allons jouer avec un code afin de vérifier notre théorie.
Dans presque tous les actuels et les machines de bureau, C
float
représente simple précision IEEE 754 nombres en virgule flottante.C'est en particulier le cas pour mon Ubuntu 18.04 amd64 Lenovo P51 ordinateur portable.
Avec cette hypothèse, toutes les affirmations passer sur le programme suivant:
subnormale.c
GitHub en amont.
Compiler et exécuter avec:
C++
En plus d'exposer l'ensemble de C de l'Api C++ expose également quelques extra subnormale une fonctionnalité qui n'est pas aussi facilement disponibles dans C dans
<limits>
, par exemple:denorm_min
: Renvoie le minimum positif subnormale valeur de type TEn C++ le trou de l'API est basée sur des modèles pour chaque type à virgule flottante, et est beaucoup plus agréable.
Implémentations
x86_64 et ARMv8 implemens IEEE 754 directement sur le matériel, dont le code C se traduit par.
Subnormals semblent être moins rapide que les normales dans certaines mises en œuvre: Pourquoi changer de 0,1 f 0 ralentir les performances en 10x? Cela est mentionné dans les BRAS de manuel, voir le "ARMv8 la section" détails de cette réponse.
ARMv8 détails
BRAS Manuel de Référence de l'Architecture ARMv8 DDI 0487C.un manuel A1.5.4 "Flush-à-zéro", décrit configurable mode où subnormals sont arrondis à zéro, afin d'améliorer les performances:
A1.5.2 "Floating-point des normes et la terminologie" Tableau A1-3 "Floating-point de la terminologie" confirme que subnormals et denormals sont synonymes:
C5.2.7 "FPCR, virgule Flottante Registre de Contrôle" décrit comment ARMv8 peut éventuellement déclencher des exceptions ou définir un indicateur de bits à chaque fois que l'entrée d'une opération de virgule flottante est subnormale:
D12.2.88 "MVFR1_EL1, AArch32 Médias et VFP Fonction Registre 1" montre que les nombres dénormalisés support est totalement facultatif en fait, et offre un peu de détecter si il y a du support:
Ceci suggère que lorsque subnormals ne sont pas mises en œuvre, les implémentations juste revenir à rincer à zéro.
L'infini et NaN
Curieux? J'ai écrit un certain nombre de choses à l':
De http://blogs.oracle.com/d/entry/subnormal_numbers: