【问题标题】:Emulating IBM floating point multiplication/addition in VBA在 VBA 中模拟 IBM 浮点乘法/加法
【发布时间】:2010-10-22 18:48:00
【问题描述】:

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

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

提前致谢。

【问题讨论】:

  • 你确定IBM使用浮点的报告吗?大多数这类事情都使用 BCD。
  • 我不是 100% 确定 - 这个决定是基于一位同事记得几年前大型机程序员解释说我们无法匹配旧数据的原因是“编译器方式的变化处理小数位”,并在我们停止看到不一致之前几年找到 SAS 添加对 IEEE 浮点和 IBM 浮点的支持的文档。
  • BCD 格式不是浮点格式 或者在 70 年代末和 80 年代的 S/34、S/36 和 S/38 的 IBM 小型计算机世界中不是。 en.wikipedia.org/wiki/Binary-coded_decimal
  • 如果您不确定这些报告是否使用了 FP,假设它们是 BCD。在尝试模拟 IBM FP 之前,请尝试使用 CurrencyDecimal 数据类型。

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


【解决方案1】:

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

快速谷歌显示来自 hercules 小组的this post,这证实了 Alberts 关于需要了解硬件的观点:

---截图--

在理论上,但在实践中却少之又少。 S/360 和 S/370 有一个 科学或商业指令集的选择。前者补充 FP指令和基址寄存器;后者小数 说明,包括编辑和编辑和标记。但更大的 360 (iirc /65 及以上)和 370(/155 及以上)型号具有两者的结合,称为 通用指令集,并且在某些时候 S/370 放弃了 选项。

---剪辑---

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

【讨论】:

    【解决方案2】:

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

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

    但是,在 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 型号(取决于您购买的产品)实际上会产生不同的结果(更多的钱 = 更高的精度)。

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

    【讨论】:

    • 我不认为我对 Access 中的单打/双打感到困惑。我知道它们都是相同的格式。问题是我需要匹配由使用 IEEE 754 格式的系统生成的数字。进入 Access 的数字是定点文本格式(例如,123.456,总是有 3 个小数位)。困难在于有计算将这些 #s 中的三个相乘,然后将数千个相加 - 我需要模拟原始硬件/软件上发生的精度错误。
    • 啊,是的,我确实读错了。在此处查看我的编辑 + 进一步的 cmets。我认为转换为 IBM 格式可能不会太难,但这只是问题的一小部分。找出内部精度很容易,但找出数学例程如何工作以及它们如何处理舍入将变得更加困难。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2016-01-14
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多