Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 在VBA中模拟IBM浮点乘法/加法_Ms Access_Vba_Floating Point_Ieee 754 - Fatal编程技术网

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

Ms access 在VBA中模拟IBM浮点乘法/加法,ms-access,vba,floating-point,ieee-754,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数

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

我还没有在VBA中找到任何其他库来执行这种转换和算术运算-有没有更简单的方法来实现这一点,或者我找不到的现有库?如果做不到这一点,就需要对相关算法进行清晰而直接的解释


提前感谢。

问题在于您混淆了access中的十进制类型问题,以及access中可用的单类型和双类型浮点值问题

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

然而,access中可用的单值和双值实际上是相同的格式,并且符合IEEE浮点标准

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

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

在我看来,这与IEEE 754标准是一样的

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

所以,基于Intel的、Access单和双,我相信与此IEEE标准相同

这里唯一真正的问题是,您要拉入访问的原始数据的格式是什么,当数据被拉入并存储时,会发生什么类型的文本、字符串或转换过程

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

编辑:

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


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

老实说,您最好先看看Hercules emulator。 除此之外,理论上使用VBA时,您可以使用Decimal类型来获得良好的结果(注意,您必须使用CDec来创建这些结果),它使用12位,可变幂为10个标量

hercules group的一个快速谷歌展示证实了艾伯茨关于需要了解硬件的观点:

---剪断--

在理论上,但在实践中,情况就不那么严重了。S/360和S/370有一个 选择科学或商业指令集。前者补充道 将FP指令和寄存器发送到基址;后者是小数点 说明,包括编辑和编辑&标记。但更大的360(iirc/65 和以上)和370个(/155和以上)型号具有这两者的结合,称为 通用指令集,在某个时候S/370丢弃了 选择权

---剪断---


我必须说,看过hercules的源代码后,您可能需要准确地知道正在执行哪些浮点操作代码(单精度、长精度、扩展精度)。

您确定IBM的报告中使用了浮点吗?大多数这类东西都使用BCD。我不是100%确定-这个决定是基于一位同事回忆起几年前一位大型机程序员解释说,我们无法匹配旧数据的原因是“编译器处理小数位数的方式发生了变化”,在我们停止看到不一致之前的几年里,我们发现SAS在IBM浮点的基础上增加了对IEEE浮点的支持。BCD格式不是浮点格式,也不是70年代末和80年代IBM小型计算机世界中的S/34、S/36和S/38。如果您不确定这些报告是否使用FP,请假定它们是BCD。在尝试模拟IBM FP之前,请尝试使用
Currency
Decimal
数据类型。我不认为我会对Access中的单/双数据类型感到困惑。我知道它们都是相同的格式。问题是,我需要匹配由未使用IEEE 754格式的系统生成的数字。进入Access的数字是定点文本格式(例如,123.456,始终带有3位小数)。困难在于,有一些计算是将其中的三个相乘,然后将数千个相乘——我需要模拟原始硬件/软件上出现的精度错误。啊,是的,我确实读错了。在这里查看我的编辑+更多评论。我认为转换为IBM格式可能不太难,但这只是问题的一小部分。找出内部精度很容易,但找出数学例程如何工作以及它们如何处理舍入在这里要困难得多。
1.401298E-45 
    to 
3.402823E38 for positive values
 ? hex(255)
     Above will show  FF

 ? csng(&hFF)
     Above will show 255