Jessaie de calculer le min / max, ou la plage de valeurs la plus basse à la plus élevée dun type à virgule flottante de 48 bits MIL-STD-1750A (PDF) (WIKI) .
Ex: Comment une plage double est 1,7E +/- 308
Jai cherché des équations et je ne sais pas si ce que jai trouvé fonctionnera.
La première équation que jai trouvée était
Je ne sais pas trop par où commencer, si elles sont même correctes dans ce dont jai besoin.
Est-ce que quelquun me communiquera ses connaissances et maidera à résoudre ce problème?
Commentaires
Réponse
Pour la virgule flottante 32 bits, la valeur maximale est indiquée dans le tableau III:
0.9999998 x 2^127 represented in hex as: mantissa=7FFFFF, exponent=7F.
Nous peut décomposer la mantisse / lexposant en une valeur décimale (close) comme suit:
7FFFFF <base-16> = 8,388,607 <base-10>.
Il y a 23 bits de signification, donc nous divisons 8 388 607 par 2 ^ 23 .
8,388,607 / 2^23 = 0.99999988079071044921875 (see Table III)
jusquà lexposant:
7F <base-16> = 127 <base-10>
et maintenant nous multiplions la mantisse par 2 ^ 127 (lexposant)
8,388,607 / 2^23 * 2^127 = 8,388,607 * 2^104 = 1.7014116317805962808001687976863 * 10^38
Il sagit de la plus grande valeur en virgule flottante de 32 bits car la plus grande mantisse est utilisée et le plus grand exposant.
La virgule flottante 48 bits ajoute 16 bits de mantisse de signification du bailleur mais laisse lexposant de la même taille. Ainsi, la valeur maximale serait représentée en hexadécimal comme
mansissa=7FFFFFFFFF, exponent=7F.
encore une fois, nous pouvons calculer
7FFFFFFFFF <base-16> = 549,755,813,887 <base-10>
lexposant maximum est toujours de 127, mais nous devons diviser par [23 + 16 = 39, donc:] 2 ^ 39. 127-39 = 88, donc multipliez simplement par 2 ^ 88:
549,755,813,887 * 2^88 = 1.7014118346015974672186595864716 * 10^38
Cest la plus grande valeur en virgule flottante de 48 bits car nous avons utilisé la plus grande mantisse possible et le plus grand exposant possible.
Les valeurs maximales sont donc:
1.7014116317805962808001687976863 * 10^38, for 32-bit, and, 1.7014118346015974672186595864716 * 10^38, for 48-bit
La valeur maximale pour 48 bits est juste légèrement supérieure à pour 32 bits, ce qui va de soi puisque quelques bits sont ajoutés à la fin de la mantisse.
(Pour être exact, le nombre maximum pour le format 48 bits peut être exprimé sous la forme dun nombre binaire qui se compose de 39 1 « s suivis de 88 0 » s.)
(Le plus petit est juste le négatif de cette valeur. Le plus proche de zéro sans être zéro peut également être facilement calculé comme ci-dessus: utilisez le la plus petite mantisse possible (positive): 0000001 et le plus petit exposant possible: 80 en hexadécimal ou -128 en décimal)
FYI
Certains formats à virgule flottante utilisent un caché non représenté 1
bit dans la mantisse (cela permet un bit supplémentaire de précision dans la mantisse, car f ollows: le premier chiffre binaire de tous les nombres (sauf 0, ou dénormaux, voir ci-dessous) est un 1
, donc nous navons pas à stocker ce 1
, et nous avons un peu plus de précision). Ce format particulier ne semble pas faire cela.
Dautres formats en virgule flottante permettent la mantisse dénormalisée, qui permet de représenter des nombres (positifs) plus petits que le plus petit exposant, en échangeant des bits de précision contre des puissances (négatives) supplémentaires de 2. Ceci est facile à supporter sil ne supporte pas aussi le bit caché, un peu plus difficile sil le fait.
8 388 607/2 ^ 23 est la valeur que vous obtiendrez avec la mantisse = 0x7FFFFF et exponent = 0x00. Ce nest pas la valeur de bit unique mais plutôt la valeur avec une mantisse full et un neutre, ou plus précisément, un zéro exposant.
La raison pour laquelle cette valeur nest pas directement 8388607, et nécessite une division (par 2 ^ 23 et donc moins que ce à quoi vous pourriez vous attendre) est que le point de base est à devant la mantisse, plutôt que après . Alors, pensez à (un bit de signe, suivi dun point de base, suivi de vingt-trois bits 1) pour la mantisse et +/- 111111111111 (pas de point de base ici, juste un entier, dans ce cas, 127 ) pour lexposant.
mantisse = 0x7FFFFF avec exposant = 0x7F est la plus grande valeur qui correspond à 8388607 * 2 ^ 104, où le 104 vient de 127-23: encore une fois, en soustrayant 23 puissances de deux car la mantisse a le point de base au début. Si le point de base était à la fin, alors la valeur la plus grande (0x7FFFFF, 0x7F) serait en effet 8 388 607 * 2 ^ 127.
Entre autres, il existe des façons possibles de considérer une valeur de bit unique pour le mantisse. Lun est mantisse = 0x400000 et lautre est mantisse = 0x000001. sans considérer le point de base ou lexposant, le premier est 4 194 304, et le second est 1. Avec un exposant nul et en considérant le point de base, le premier est 0,5 (décimal) et le second est 0,00000011920928955078125. Avec un exposant maximum (ou minimum), nous pouvons calculer des valeurs de bit unique maximum (ou minimum).
(Notez que le dernier format où la mantisse a des zéros non significatifs serait considéré comme dénormalisé dans certains formats de nombres, et sa représentation normalisée serait 0x400000 avec un exposant de -23).
Commentaires
- Jai un doute. En faisant 8 388 607/2 ^ 23 donne ce quun seul bit de la mantisse peut représenter. Alors, comment 8 388 607/2 ^ 23 * 2 ^ 127 représente la valeur maximale?
- @hariprasad, je vais mettre un post-scriptum sur la réponse, car il est trop difficile à expliquer dans le format des commentaires.
- où est la valeur minimale? il ' est demandé dans le titre!
- @CharlieParker, contrairement aux représentations entières où min et max sont décalés, les formats à virgule flottante utilisent le signe & représentations de magnitude, où la magnitude est composée dun exposant et dune mantisse. Le nombre maximum dans la grandeur de signe est alors (1) positif (le bit de signe est 0) et (2) le plus grand exposant possible et (3) la plus grande mantisse possible. Le nombre minimum est identique: sauf que le bit de signe change, il est donc (1) négatif (le bit de signe est 1), mais (2) le plus grand exposant possible et (3) la plus grande mantisse possible. Comme je lai expliqué ci-dessus, le nombre minimum est juste -max, alors lancez simplement un signe
-
.
Réponse
Vous pouvez emprunter la disposition de la virgule flottante IEEE pour une comparaison rapide: signe, exposant, mantisse. cependant dans ce PDF, je vois que la mantisse et lexposant sont inversés.
Cela signifie que pour comparer, vous devrez dabord vérifier le bit de signe et si lun dentre eux nest pas encore le gagnant, vous comparez les exposants, puis vous comparez la mantisse.
Si lun est positif et lautre négatif, alors le positif est le maximum.
Si les deux sont positifs et quun exposant est plus grand, alors cest le maximum (si les deux sont négatifs alors cest le min)
De même pour la mantisse.
a<b?a:b
eta>b?a:b