我正在执行一个独立的企业COBOL程序,计算如下。我有一个计算多个操作和另一个完整的计算分裂。但是在这两种情况下结果是不同的(最后4位数字)。COBOL COMPUTE计算
我已经使用计算器手动计算了这些值,结果与分割COMPUTE语句的结果相匹配。我已经通过使用中间结果的整个答案来尝试计算,并且只使用最终答案的15位数字,并且在所有中间步骤(没有舍入)中也只使用15位数字。但是这些结果中没有一个与COMPUTE结果相结合。
有人能帮我理解为什么会有这样的差异。
05 WS-A PIC S9(3)V9(15) COMP.
05 WS-B PIC S9(3)V9(15) COMP.
05 WS-C PIC S9(3)V9(15) COMP.
05 WS-D PIC S9(3)V9(15) COMP.
05 WS-E PIC S9(3)V9(15) COMP.
05 WS-RES PIC S9(3)V9(15) COMP.
05 RES-DISP PIC -9(2).9(16).
MOVE 3.56784 TO WS-A.
MOVE 1.3243284234 TO WS-B.
MOVE .231433897121334834 TO WS-C.
MOVE 9.3243243213 TO WS-D.
MOVE 7.0 TO WS-E.
COMPUTE WS-RES = WS-A/WS-B.
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES/WS-C.
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES/(WS-D + WS-E).
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES * (WS-C - WS-A)
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES + WS-E ** WS-B
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES + WS-D.
MOVE WS-RES TO RES-DISP.
结果最后计算的合并=计算的20.1030727225138740
COMPUTE WS-RES = WS-A/WS-B/WS-C/
(WS-D + WS-E) * (WS-C - WS-A) +
WS-E ** WS-B + WS-D.
MOVE WS-RES TO RES-DISP.
结果= 20.1030727225138680
我已经更新了答案,有一个微妙的指数,我认为这是你看到的实际问题。通过你所拥有的价值观和计算,我认为排序并不重要。想知道为什么你没有诊断信息,我想我已经发现 –
这种特殊情况是当汇编列表(LIST)可以派上用场。理解编译器生成的代码可以帮助理解结果。优化也可能会造成偏差,但我相信这将成为Enterprise COBOL 5.1的更多问题,因为它使用与C和PL/I相同的代码生成器。对于“有趣”,我会拿你的原始代码并比较生成的代码。您已经从Bill那里得到了一个很好的答案,并且比较了此处显示的所有代码(原始代码和解决方案)中生成的代码,这将有助于您更好地理解编译器的工作方式。 – zarchasmpgmr