2016-11-18 2 views
3

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.

+2

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 –

+2

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

+0

@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 –

Répondre

4

Non, ce n'est pas la façon dont vous calculez ... Lorsque vous vous déplacez vers la droite de la virgule décimale. La précision augmente.

Calculer en utilisant cette formule Considérons la valeur de n pour diminuer comme -1 -2 -3 ...

maintenant valeur décimale = 0 * 2 ^ -1 + 0 * 2^-2 + 1 * 2^-3 + 0 * 2^-4 + 0 * 2^-5 + 1 * 2^-6 etc. jusqu'à la fin

+0

Cela ne donne pas vraiment le résultat que j'attends. La partie fractionnaire devrait être une approximation de PI, (.1416, par exemple) –

+0

Oups, ça fonctionne parfaitement, merci. –

+0

Votre bienvenue. C'est un calcul de base –