COBOL - 从大型机到PC的不同答案相同的COMPUTE

时间:2016-10-04 14:04:25

标签: cobol mainframe gnucobol

我有这个非常简单的虚拟COBOL程序,它执行虚拟COMPUTE并显示结果。

   ID DIVISION.
   PROGRAM-ID. DUMMYPGM.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 NUM-A PIC 9(3) VALUE 399.
   01 NUM-B PIC 9(3) VALUE 211.
   01 NUM-C PIC 9(3).
  *
   PROCEDURE DIVISION.
   MAIN.
       COMPUTE NUM-C = ((NUM-A / 100) - (NUM-B / 100)) * 100
       DISPLAY 'NUM-C IS ' NUM-C
       STOP RUN.

当我在大型机上编译此代码(使用编译器MVS Enterprise COBOL V4.2)并执行它时,我得到" NUM-C IS 100",可能是因为(399/100)被视为计算中为3而不是3.99(同样适用于211/100)。

但是当我在PC上编译完全相同的代码(使用GnuCobol编译器)并执行它时,我得到了" NUM-C IS 188"。 PC的答案是正确的,但我想让它的行为与大型机一样(因此,在该计算语句中失去精度而不是188而不是)... ...我该怎么做?

以上原因是此代码的一般表达式:

 COMPUTE PDISCR = (((((X(1) + DX - XBRAK) * (ABRAK(1) / 1000)) / 100)
                  + PHT(1) + DPH - PHBRAK) * 2) + ((V(1) + DV 
                  + VBRAKMPM) * (V(1) + DV - VBRAKMPM) / 100000)) 

这是50年历史的火车模拟计划的一部分,我需要迁移到GnuCOBOL。 COMPUTE中使用的所有字段都是整数。我需要能够从GnuCOBOL获得相同的答案。

确认OpenCOBOL / GnuCOBOL高达2.0。

2 个答案:

答案 0 :(得分:1)

https://lwn.net/Articles/733129/

此链接提到gnuCobol 2.2的新std选项:ibm-strict。我想知道这是否会迫使compute语句执行您想要的操作。

答案 1 :(得分:0)

由于看起来IBM会截断您的值而GnuCobol不会,您可能希望利用GnuCobol函数来模仿IBM的方式。

至少对于正整数,这可能很简单:

COMPUTE NUM-C = ((INTEGER(NUM-A / 100)) - (INTEGER(NUM-B / 100))) * 100

我没有测试这是否适用于负整数,因为(1)doco似乎表明它向负无穷大而不是零循环; (2)似乎没有TRUNCATE函数; (3)我认为你没关心,因为你的数据类型还没有签名。

如果你需要处理否定,那么有一些数学方法会为你做,我建议用另一个问题来解答。