5

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

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

提前致谢。

4

2 回答 2

2

老实说,您最好先看看 Hercules 模拟器。 http://www.hercules-390.org/除了理论上使用 VBA 之外,您还可以使用 Decimal 类型来获得良好的结果(注意您必须使用 CDec 来创建这些),它使用 12 位,可变幂为 10 标量.

一个快速的谷歌显示了大力神组的这篇文章,这证实了 Alberts 关于需要了解硬件的观点:

---剪断--

在理论上,但在实践中则更少。S/360 和 S/370 可以选择科学或商业指令集。前者将FP指令和寄存器添加到基址;后者是十进制指令,包括Edit 和Edit & Mark。但是更大的 360(iirc /65 及以上)和 370(/155 及以上)模型将两者结合在一起,称为通用指令集,并且在某些时候 S/370 放弃了该选项。

---剪断---

我不得不说,在查看了 hercules 源代码之后,您可能需要确切地确定正在执行哪些浮点操作代码(就精度而言,单精度、长精度、扩展精度)。

于 2010-10-29T12:33:21.770 回答
1

问题是您对访问中的十进制类型以及访问中可用的单双类型浮点值的问题感到困惑。

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

但是,在 access 中可用的 single 和 double 值实际上是相同的格式,并且符合 IEEE 浮点标准。

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

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

1.401298E-45 
    to 
3.402823E38 for positive values

在我看来,这与 IEEE 754 标准相同。

因此,如果您将 access 中的值作为一个单独的值相加,您应该得到相同的结果。

因此,我相信基于 Intel 的 Access single 和 doubles 与此 IEEE 标准相同。

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

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

 ? hex(255)
     Above will show  FF

 ? csng(&hFF)
     Above will show 255

编辑:

啊,好吧,我现在明白了,我把这个颠倒过来了,我的错在这里。这里的问题是假设您将数字转换为较旧的 IBM 格式(超过 64 位?),那么您将不得不掌握他们用于添加这些数字的代码。事实上,即使在那个时候,不同的 IBM 模型取决于您购买的产品实际上会产生不同的结果(更多的钱 = 更高的精度)。

因此,您不仅需要转换例程来转换为内部表示,然后您还需要加/减/乘这些数字的例程。因此,仅拥有转换例程不会让您走得太远,因为您还必须复制它们进行数学运算的确切例程。就它们如何舍入数字等而言,这些类型的例程可能并不完全相同。

于 2010-10-22T22:23:16.567 回答