Une mise à jour de la norme des nombres flottants |
————— 30 Juillet 2019 à 11h07 —— 35393 vues
Une mise à jour de la norme des nombres flottants |
————— 30 Juillet 2019 à 11h07 —— 35393 vues
Vous ne vous êtes peut-être jamais posé la question, mais les ordinateurs manipulent principalement deux types de nombres : les nombres entiers et les nombres flottants. Si les premiers sont un simple encodage en binaire - soit en base 2 pour les plus matheux - ils sont parfois limités sur leur valeur maximum / minimum (sur un système 64-bits, on encode au mieux des nombres de 0 à 264 - 1 = 18 446 744 073 709 551 999, ce qui peut sembler grand... Mais ne l'est pas tellement pour un CPU qui peut faire des milliards d'opérations par seconde !), et surtout ne peuvent pas représenter de nombre à virgule. Pour pallier à ce dernier point, on peut utiliser la représentation entière puis diviser le nombre par un facteur constant : on appelle cela la représentation en virgule fixe. Par exemple, avec un facteur de division de 1000, un système 64-bit représente les nombres de 0 à 18 milliards de milliards tous les 0,001 (pas fixe, d'où le nom).
Cependant, impossible toujours de représenter des nombres très grands, ni très petits. D'où l'idée de la virgule flottante : représenter un nombre par une partie entière nommée mantisse multipliée par un nombre fixe, lui même mis à la puissance d'un second nombre entier (possiblement négatif) nommée exposant, ici "2" : N = mantisse * 2exposant. Avec ce système, la plupart des soucis de représentations sont réglés... au détriment d'une complexité des calculs accrue. De plus, des cas limites se présentent tels la représentation de l'infini, de zéro et des NaN (Not a Number, apparaît lorsque le calcul a sérieusement foiré quelque part) : il faut donc une norme pour gérer tout ça.
Et cette norme, c'est l'IEEE 754. Rédigée pour sa première version en 1985, elle décide de la répartition entier / mantisse et, justement, de la gestion des cas pathologiques. Cette dernière avait été mise à jour en 2008, et vient de voir une révision en cette année de grâce 2019.
Standard | Norme | Bits de mantisse | Bits d'exposant |
---|---|---|---|
IEEE 754 | float64 | 53 | 11 |
IEEE 754 | float32 | 24 | 8 |
IEEE 754 | float16 | 11 | 5 |
Intel | bfloat16 | 8 | 8 |
Comparaison des flottants, le bloat16 (Brain Float) étant développé pour le machine learning dans les derniers FPGA bleus
Le document coûte la bagatelle de 99 $, et stipule désormais quelques nouvelles fonctions : tanPi, aSinPi et aCosPi qui sauront ravir les scientifiques ou développeurs hardcores, mais surtout quelques corrections concernant la gestion du NaN : désormais, le maximum ou minimum d'un couple (nombre, NaN) sera lui aussi NaN. Logique, non ? Ce n'est pourtant pas le comportement du SSE et de l'AVX... qui ne correspond pas non plus à la norme de 2008 soit dit en passant ! Du coup, pas bientôt dans nos CPU, cet IEEE 754-2019 ? (Source : Agner Fog)
Au secours ! C'est le NaN cat !
Un poil avant ?Le noyau Linux en 32 bits, ça se perd lentement ! | Un peu plus tard ...SK Hynix, et l'art de ralentir et d’accélérer sur la NAND simultanément |