COBOL-对于相同的计算,从大型机到PC的答案不同

COBOL-对于相同的计算,从大型机到PC的答案不同,cobol,mainframe,gnucobol,Cobol,Mainframe,Gnucobol,我有一个非常简单的虚拟COBOL程序,它进行虚拟计算并显示结果 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. CO

我有一个非常简单的虚拟COBOL程序,它进行虚拟计算并显示结果

   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是100”,可能是因为(399/100)在计算中被视为3而不是3.99(211/100也是如此)

但是当我在PC上编译相同的代码(使用GnuCobol编译器)并执行它时,我得到“NUM-C是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年历史的列车模拟程序的一部分,我需要将其迁移到GnuCOBOL。计算中使用的所有字段都是整数。我需要能够从GnuCOBOL那里得到同样的答案


已确认OpenCOBOL/GnuCOBOL高达2.0。

因为看起来IBM会截断您的值,而GnuCOBOL不会,所以您可能希望使用GnuCOBOL函数来模拟IBM的做法

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

COMPUTE NUM-C = ((INTEGER(NUM-A / 100)) - (INTEGER(NUM-B / 100))) * 100
我还没有测试这是否适用于负整数,因为(1)doco似乎表明它向负无穷大而不是零舍入;(2) 似乎没有
TRUNCATE
函数;(3)我假设您不在乎,因为您的数据类型没有签名

如果你真的需要处理负片,有一些数学方法可以帮你,我建议用另一个问题问它。


这个链接提到了Gnucobol2.2的一个新的std选项:IBMStrict。我想知道这是否会迫使compute语句执行您想要的操作。

很抱歉误解:所谓复杂,我指的是一次计算中的多个操作(这里有两个除法和一个乘法,而不是一个操作)。我承认代码不是很好,但它只是一个概念证明。我确实想让自己听起来更优秀,所以我编辑了我的帖子。至于GnuCOBOL版本,我写了cobc-V,得到了这个:cobc(OpenCOBOL)1.1.0版权所有(C)2001-2009 Keisuke Nishida/Roger建造于2010年9月10日10:12:33包装于2009年2月6日10:30:55 CETI知道一个可能的解决方案是将计算的每一步都隔离在不同的整数变量中,但我想找到一个更好的解决方案,因为这里有一个我正在处理的代码中的COMPUTE语句的例子:COMPUTE PDISCR=((((X(1)+DX-XBRAK)*(ABRAK(1)/1000)/100)+PHT(1)+DPH-PHBRAK)*2)+((V(1)+DV+VBRAKMPM)*(V(1)+DV-VBRAKMPM)/100000))
cobc-std=ibm
将“正确地执行此操作”在未来的版本中,我们将为这个可能的转换问题添加一个警告选项,请参阅哦!我没想到GNUCobol的开发人员会对它做些什么。。。我很惊讶!当然,在此期间,我已经对我的计算进行了剥离,但如果其他人将旧的大型机代码传输到PC并期望得到相同的结果,那么这个功能将非常好。