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

Kev*_*bbs 5 floating-point ms-access vba ieee-754

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

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

提前致谢.

Alb*_*lal 1

问题是您混淆了访问中的小数类型问题以及访问中可用的单精度和双精度类型浮点值的问题。

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

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

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

-3.402823E38 
    to 
-1.401298E-45 for negative values
Run Code Online (Sandbox Code Playgroud)

1.401298E-45 
    to 
3.402823E38 for positive values
Run Code Online (Sandbox Code Playgroud)

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

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

因此,基于 Intel 的 Access 单打和双打我相信与此 IEEE 标准相同。

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

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

 ? hex(255)
     Above will show  FF

 ? csng(&hFF)
     Above will show 255
Run Code Online (Sandbox Code Playgroud)

编辑:

啊,好吧,我现在明白了,我的错在这里。这里的问题是假设您将数字转换为较旧的 IBM 格式(Excess 64?),那么您将必须掌握他们用于添加这些数字的代码。事实上,即使在那时,不同的 IBM 型号根据您购买的产品实际上会产生不同的结果(更多的钱 = 更精确)。

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