Assembly 如何翻译8087协处理器返回的短实数的小数部分?

Assembly 如何翻译8087协处理器返回的短实数的小数部分?,assembly,binary,numbers,x86-16,real-number,Assembly,Binary,Numbers,X86 16,Real Number,我编写了一个简单的程序,将pi加载到8087中寄存器堆栈的顶部,然后将该常量返回到一个短的实内存变量中 FLDPI ;load pi FSTP DWORD PTR shortReal ;store pi in memory, then pop stack 存储在shortReal中的值为40 49 0F DB十六进制。这在二进制中转换为0100000001001111011011 第一位是0,所以是正数。偏置指数部分转换为1 因此,实际数字如下所示:

我编写了一个简单的程序,将pi加载到8087中寄存器堆栈的顶部,然后将该常量返回到一个短的实内存变量中

FLDPI                     ;load pi
FSTP DWORD PTR shortReal  ;store pi in memory, then pop stack
存储在shortReal中的值为40 49 0F DB十六进制。这在二进制中转换为0100000001001111011011

第一位是0,所以是正数。偏置指数部分转换为1

因此,实际数字如下所示:

1(隐含点)1001001000011111011

1(隐含点)1转换为3,这是π的正确整数部分,但我的理解在这一点之后就崩溃了

现在剩下以下数字:

00100100001111101101101101101

001可以转换为1,这是正确的。然而,这意味着下一个数字将是001,这将再次是1,这是错误的,或者它可能是0010,这等于2,但这也是错误的


如何区分小数部分中的每个数字

不,这不是你计算的方式。。。 从小数点向右移动时。精确度提高了

用这个公式计算 考虑N值减少,如-1 - 2 - 3…< /P> 现在 十进制值=
0*2^-1+0*2^-2+1*2^-3+0*2^-4+0*2^-5+1*2^-6等,直到最后

这并不是我期望的结果。小数部分应该是PI的近似值,(例如.1416)x87的32位浮点格式正是binary32(也称为单精度)格式。这里有一些你想要用手解码的例子,还有一个方便的在线转换器:请注意8087 ROM中的pi值有点不正确,以防万一。@FUZxxl:x87有一个内部pi,精度为66位,用于减小FSIN的范围等等。(这还不够精确,不适合这种用途,请参阅,一系列非常优秀的文章的一部分)。但这难道不应该足够精确,以获得存储到64位双精度浮点或32位浮点的pi的正确舍入值吗?还是对FLDPI使用不同的值?或者你只是说加载的不是一个精确的80位值internally@PeterCordes最后一部分。