COBOL代码背后的逻辑

时间:2017-02-27 12:38:41

标签: cobol mainframe

我无法理解这些界限背后的逻辑:

          COMPUTE temp = RESULT - 1.843E19.
          IF temp IS LESS THAN 1.0E16 THEN

数据定义:

000330  01  VAR1 COMP-1 VALUE 3.4E38.  // 3.4 x 10 ^ 38

以下是上下文中的那些行(子程序返回一个平方根):

            MOVE VAR1 TO PARM1.
          CALL "SQUAREROOT_ROUTINE" USING
              BY REFERENCE PARM1,
              BY REFERENCE RESULT.
          COMPUTE temp = RESULT - 1.843E19.
          IF temp IS LESS THAN 1.0E16 THEN
              DISPLAY "OK"
          ELSE
              DISPLAY "False"
          END-IF.

2 个答案:

答案 0 :(得分:2)

这些行只是试图测试SQUAREROOT_ROUTINE返回的结果是否正确。由于程序使用浮点值而且数字相当大,这可能看起来有点复杂。我们来算一算:

你从3.4E38开始,squareroot是1.84390889 ...... E19。 通过减去1.843E19(即近似结果)并将差值与1.0E16进行比较,程序正在测试结果是否在1.843E19和1.843E19 + 1.0E16 = 1.844E19之间。

如果SQUAREROOT_ROUTINE的结果太低而不是太高,则此测试不会发现错误。要捕获两种类型的错误结果,您应该将差异的绝对值与容差进行比较。

你可能会问"为什么让事情如此复杂?#34;?问题是浮点值通常不准确,并且根据使用的精度,由于舍入误差,您将得到明显不同的结果。

答案 1 :(得分:1)

好的逻辑本身非常简单,你从1.843*(10^19)的结果中减去SQUAREROOT_ROUTINE并将该值放在名为temp的变量中,然后如果值temp的{​​{1}}小于1.0*(10^16)你打算输出一行说出" OK",否则你将打印出#34; False&#34 ; (如果该值等于或大于)。

如果你的意思是为什么这个代码存在的逻辑,你将需要与代码的作者交谈,但它看起来像一个留在程序中的调试显示。