J'ai écrit un programme simple qui charge pi dans le haut de la pile de registres dans le 8087, puis il retourne cette constante dans une variable de mémoire réelle courte.Comment traduisez-vous la partie fractionnaire d'un nombre réel court renvoyé par le coprocesseur 8087?
FLDPI ;load pi
FSTP DWORD PTR shortReal ;store pi in memory, then pop stack
La valeur stockée dans shortReal est 40 49 0F DB hex. Cela se traduit par 0100000001001001111111011011 en binaire.
Le premier bit est 0, donc c'est un nombre positif. La partie exposant biaisé traduit à 1.
Ainsi, le nombre réel ressemble à ceci:
1 (point implicite) 10010010000111111011011
1 (point de implicite) 1 traduit à 3., de sorte que c'est la bonne partie entière de PI, mais ma compréhension se décompose après ce point.
Maintenant, le numéro reste sur:
001 pourrait se traduire 1, ce qui serait correct. Cependant, cela signifie que le prochain numéro serait 001, ce qui serait à nouveau 1, ce qui est faux, ou pourrait être 0010, ce qui équivaut à 2, mais c'est faux aussi.
Comment séparer chaque chiffre de la partie fractionnaire.
Le format flottant de 32 bits x87 est exactement le [IEEE-754] (https: //en.wikipedia.org/wiki/IEEE_floating_point) Format binaire32 (alias simple précision). Le [article Wikipédia] (https://en.wikipedia.org/wiki/Single-precision_floating-point_format) a des exemples de décodage à la main comme vous essayez de le faire, et il y a un convertisseur en ligne très pratique: https: // www.h-schmidt.net/FloatConverter/IEEE754.html –
Notez que la valeur de pi dans la ROM 8087 est légèrement incorrecte, juste au cas où vous vous poseriez la question. – fuz
@FUZxxl: x87 a un pi interne avec 66 bits de précision qu'il utilise pour la réduction de gamme pour FSIN et ainsi de suite. (ce qui n'est pas assez précis pour cet usage, voir [l'excellent article de Bruce Dawson] (https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion /), partie d'une très excellente série d'articles). Mais cela ne devrait-il pas être assez précis pour obtenir une valeur de pi correctement arrondie stockée dans un flotteur double ou 32 bits de 64 bits? Ou utilise-t-il une valeur différente pour FLDPI? Ou étiez-vous juste en train de dire que ce n'était pas une valeur 80 bits précise qui est chargée en interne –