我有一个非常简单的虚拟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的答案是正确的,但是我想使其表现得与大型机类似(因此,在该计算语句中失去了精确度,从而得到100而不是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年历史的Train模拟程序的一部分,我需要将其迁移到GnuCOBOL。 COMPUTE中使用的所有字段都是整数。我需要能够从GnuCOBOL获得相同的答案。

已确认OpenCOBOL/GnuCOBOL最高为2.0。

最佳答案

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

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

关于COBOL-对于相同的COMPUTE,从大型机到PC的答案不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39854413/

10-10 19:25