在VBA中模拟IBM浮点乘法/加法

时间:2010-10-22 18:48:00

标签: ms-access vba floating-point ieee-754

我试图在Access 2003或Access 2010环境中模拟(不再存在)大型机报表生成器。它生成的数据必须与70年代早期的纸质报告完全匹配。不幸的是,最早的年份数据是在使用IBM浮点表示而不是IEEE的硬件上运行的。在Google的帮助下,我找到了一个VBA函数库,它将浮点数从十进制转换为IEEE 754 32位二进制格式。我不得不修改库以接受32位或64位浮点数,所以我对浮点格式有一个适度的工作知识,但是,我在从IEEE转换为IBM二进制格式时遇到麻烦,以及麻烦的倍增和添加IBM或IEEE编号。

我还没有找到任何其他库来在VBA中执行此转换和算术运算 - 是否有更简单的方法来解决这个问题,或者我找不到的现有库?否则,对相关算法的清晰直接的解释?

提前致谢。

2 个答案:

答案 0 :(得分:2)

说实话,你可能会从查看Hercules模拟器开始做得更好。 http://www.hercules-390.org/除了理论上与VBA之外,您可以使用Decimal类型获得良好的结果(请注意,您必须使用CDec来创建这些),它使用12位,变量幂为10个标量。

来自大力士团队的快速谷歌展示this post,这证实了Alberts指出需要了解硬件:

---剪断 -

理论上,但在实践中却不那么重要。 S / 360和S / 370有一个 选择科学或商业指令集。前者补充说 FP指令和寄存器到基地;后者是小数 说明,包括编辑和编辑&标记。但更大的360(iirc / 65 和370)(/ 155和以上)模型具有两者的结合,称为 通用指令集,在某些时候S / 370下降了 选项。

--- ---剪断

我不得不说,看过大力神的源代码,您可能需要确切地确定正在执行哪些浮点运算代码(精度单,长,扩展)。

答案 1 :(得分:1)

这里的问题是你在访问中使用十进制类型的问题,以及访问中可用的单一和双重类型浮点值的问题。

如果您在访问中使用货币数据类型,则这是一个缩放的整数,并且不会产生舍入(这是我们大多数人用于财务计算和报告的情况)。您还可以在访问中使用十进制值,并且它们根本不会舍入,因为它们是压缩小数。

但是,访问内部可用的单值和双值实际上都是相同的格式并符合IEEE浮点标准。

对于访问单个变量,这是一个32位数字,范围是:

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

1.401298E-45 
    to 
3.402823E38 for positive values

对我来说,这与IEEE 754标准相同。

因此,如果您将访问中的值作为单个添加,则应该获得相同的结果。

因此,基于英特尔,我相信Access单一和双打与IEEE标准相同。

它唯一真正的问题是,您要访问的原始数据的格式是什么,以及在拉入和存储数据时会发生什么类型的文本或字符串或转换过程?

Access可以转换数字。尝试在访问命令行提示符(调试窗口)

中键入这些值
 ? hex(255)
     Above will show  FF

 ? csng(&hFF)
     Above will show 255

编辑:

啊,好吧,我现在看到我有这个逆转,我错了。这里的问题是假设你将一个数字转换为旧的IBM格式(Excess 64?),那么你必须得到他们用于添加这些数字的代码。事实上,即便在那时,不同的IBM型号取决于您购买的产品实际上产生了不同的结果(更多的钱=更精确)。

因此,您不仅需要转换例程转换为内部表示,那么您需要添加/减去/乘以这些数字的例程。因此,只是拥有转换例程并不会让你走得太远,因为你还必须复制他们完成数学的确切例程。这些类型的例程可能并非在数字轮数等方面都是平等的。