Gae*_*l L 10 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.
Run Code Online (Sandbox Code Playgroud)
当我在大型机上编译此代码(使用编译器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))
Run Code Online (Sandbox Code Playgroud)
这是50年历史的火车模拟计划的一部分,我需要迁移到GnuCOBOL.COMPUTE中使用的所有字段都是整数.我需要能够从GnuCOBOL得到相同的答案.
确认OpenCOBOL/GnuCOBOL高达2.0.
由于看起来 IBM 会截断您的值,而 GnuCobol 不会,因此您可能希望利用 GnuCobol 函数来模拟 IBM 的做法。
至少对于正整数,这可能很简单:
COMPUTE NUM-C = ((INTEGER(NUM-A / 100)) - (INTEGER(NUM-B / 100))) * 100
Run Code Online (Sandbox Code Playgroud)
我还没有测试这是否适用于负整数,因为 (1) doco 似乎表明它向负无穷大而不是零舍入;(2) 似乎没有TRUNCATE;(3)我假设你不在乎,因为你的数据类型无论如何都没有签名。
如果您确实需要处理负数,有一些数学方法可以为您做到这一点,我建议在另一个问题中提出。
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |