2010-10-22 229 views
5

我試圖在Access 2003或Access 2010環境中模擬(不再存在的)大型機報告生成器。它生成的數據必須與70年代初的紙質報告完全一致。不幸的是,最早的數據是在使用IBM浮點表示而不是IEEE的硬件上運行的。在Google的幫助下,我找到了一個VBA函數庫,它將浮點數從十進制轉換爲IEEE 754 32位二進制格式。我不得不修改庫以接受32位或64位浮點數,所以我對浮點格式有一定的瞭解,但是,我在從IEEE到IBM二進制格式的轉換中遇到了麻煩,以及遇到了繁瑣和增加的問題IBM或IEEE編號。在VBA中模擬IBM浮點乘法/添加

我沒有打開的任何其他庫,用於執行在VBA這種轉換和算術運算 - 是否有更簡單的方式去了解這一點,或者說我沒有找到一個現有的庫?否則,相關算法的清晰直接的解釋是什麼?

在此先感謝。

+0

你肯定對IBM使用浮點報告嗎?大部分這類事情都使用BCD。 – Gabe 2010-10-22 18:50:01

+0

我不是100%肯定 - 這個決定是基於一個同事回憶的大型機程序員解釋年前,我們無法比擬的舊數據的原因是由於「在編譯器處理小數位方式的變化」,並發現在我們停止看到不一致之前的幾年,SAS增加了對IEEE浮點和IBM浮點的支持。 – 2010-10-22 19:15:01

+0

BCD格式不是浮點格式,或者在70年代末和80年代在S/34,S/36和S/38的IBM微型計算機世界中不是。 http://en.wikipedia.org/wiki/Binary-coded_decimal – 2010-10-22 21:15:13

回答

1

的問題是,這裏是你混淆了訪問小數類型的問題,而單雙型浮點值的可接入性。

如果您在訪問使用貨幣數據類型,這是一個縮放整數,且不會產生圓(這就是我們大多數人使用的財務計算和報告)。您也可以在訪問中使用十進制值,並且它們再次不包括小數點,因爲它們是打包的小數。

然而,無論是可用的接入內的單,雙值實際上相同的格式和符合IEEE浮點標準。

對於接入單可變,這是一個32位的數,其範圍是:

-3.402823E38 
    to 
-1.401298E-45 for negative values 

1.401298E-45 
    to 
3.402823E38 for positive values 

這看起來是相同的以我爲IEEE 754標準。

所以,如果你在訪問一個單一加起來值,你應該得到的圓棒相同的結果。

所以,基於Intel,Access和single雙倍我相信和這個IEEE標準一樣。

唯一真正的問題是,這裏是什麼是你拉入訪問原始數據,以及什麼樣的文本或字符串或轉換過程中的時數據拉入和存儲發生的格式?

訪問可以轉換數字。嘗試在訪問命令行提示符下鍵入這些值(調試窗口)

? hex(255) 
    Above will show FF 

? csng(&hFF) 
    Above will show 255 

編輯:

嗯,好吧,我現在看到我有這樣的逆轉,我的錯在這裏。這裏的問題是假設您將一個數字轉換爲舊的IBM格式(超額64?),那麼您必須親自操作它們用於添加這些數字的代碼。事實上,即使在那個時候,根據您購買的不同IBM模型實際產生不同的結果(更多的錢=更高的精度)。

所以,你不僅需要轉換程序轉換爲內部表示,然後需要的是添加/例程減/乘這些數字。因此,只有轉換例程不會讓你走得很遠,因爲你還必須複製確實的數學例程。這些類型的例程可能不是所有在如何輪數等方面平等

+0

我不認爲在Access中我對單打/雙打感到困惑。我知道他們都是相同的格式。問題是我需要匹配系統生成的數字,這些數字不是*使用IEEE 754格式。進入Access的數字是定點文本格式(例如123.456,總是有3位小數)。難點在於有計算結果將這些#中的三個乘以3,然後將它們加在一起 ​​- 我需要模擬在原始硬件/軟件上發生的精度錯誤。 – 2010-10-25 12:37:26

+0

啊,是的,我確實讀過這個錯誤。在這裏查看我的編輯+進一步評論。我認爲轉換到IBM格式可能不會太難,但這只是問題的一小部分。找出內部精確度很容易,但找出數學例程是如何工作的,以及他們如何處理舍入會在這裏變得更加困難。 – 2010-10-25 13:50:06

2

說實話你可能會做的更好看的大力神模擬器啓動。 http://www.hercules-390.org/除此之外與VBA理論上可以使用十進制類型中獲得好成績(注意,您必須CDEC創建這些),它採用12位十個標量的變。

快速谷歌顯示了大力神組,這證實了有關需要知道硬件阿爾貝茨點this post

--- Snip--

在理論上,而是少所以在實踐中。 S/360和S/370有一個 選擇科學或商業指令集。前者增加了 FP指令並註冊到基地;後者爲小數點 指令,包括編輯和編輯&標記。但較大的360(IIRC/65 及以上)和370(/ 155及以上)的模型有兩個的結合,稱爲 通用指令集,並在某些時候的S/370扔下 選項。

---剪斷---

我不得不說,說完看着你可能需要弄清楚究竟哪些浮點操作碼(在單精度,長期的大力士源代碼,擴展)正在執行。