2016-11-18 35 views
3

我寫了一個簡單的程序,將pi加載到8087的寄存器堆棧的頂部,然後將該常量返回到一個短的實內存變量中。如何翻譯8087協處理器返回的短實數的小數部分?

FLDPI      ;load pi 
FSTP DWORD PTR shortReal ;store pi in memory, then pop stack 

存儲在shortReal中的值是40 49 0F DB hex。這轉換爲二進制的0100000001001001111111011011。

第一位是0,所以它是一個正數。偏置指數部分轉換爲1

因此,實際數目如下:

1(隱含點)10010010000111111011011

1(隱含點)1轉換爲3,所以這是正確的PI的整數部分,但是我的理解在這一點之後分解了。

現在下面的號碼遺留:

001可以轉化爲1,這將是正確的。但是,這意味着下一個數字將是001,也就是1,這是錯誤的,或者它可能是0010,即等於2,但這也是錯誤的。

如何分出小數部分的每個數字。

+2

x87的32位浮點格式正好是[IEEE-754](https: //en.wikipedia.org/wiki/IEEE_floating_point)binary32(又名單精度)格式。 [Wikipedia文章](https://en.wikipedia.org/wiki/Single-precision_floating-point_format)有一些手動解碼的例子,就像你正在做的那樣,並且有一個方便的在線轉換器:https:// www.h-schmidt.net/FloatConverter/IEEE754.html –

+2

請注意,在8087 ROM中pi的值稍微不正確,以防萬一您想知道。 – fuz

+0

@FUZxxl:x87具有66位精度的內部pi,用於FSIN等的範圍縮減。 (這不夠準確,請參閱[Bruce Dawson的優秀文章](https://randomascii.wordpress.com/2014/10/09/intel-underestimates-error-bounds-by-1-3-quintillion /),是一系列非常優秀的文章的一部分)。但是,這不應該足夠準確,無法獲得存儲爲64位雙精度浮點數或32位浮點數的pi的正確舍入值嗎?或者它是否爲FLDPI使用了不同的值?或者你只是說它不是一個精確的80位值,它在內部加載 –

回答

4

不,這不是你如何計算... 當你從小數點向右移動。準確度增加。使用

計算該公式 考慮在n值減小像-1 -2 -3 ...

現在 十進制值= 0 * 2^-1 + 0 * 2^-2 + 1 * 2^-3 + 0 * 2^-4 + 0 * 2^-5 + 1 * 2^-6等直到結尾

+0

這並不是真的給我期望的結果。小數部分應該是PI的近似值(例如,.1416)。 –

+0

糟糕的是,這完全可以工作,謝謝。 –

+0

歡迎您。這是基本的數學 –

相關問題