2010-10-22 231 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扔下 选项。

---剪断---

我不得不说,说完看着你可能需要弄清楚究竟哪些浮点操作码(在单精度,长期的大力士源代码,扩展)正在执行。