逻辑

2017-02-27 87 views
-1

我无法理解什么是这些线背后的逻辑:逻辑

  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. 

感谢piet.t,这里还有一个问题 一个cosine_routine被称为,3.4E38传递到例程,它返回结果

COMPUTE temp_var = -0.915 - RESULT 
IF temp_var IS LESS THAN 0.001 THEN 
DISPLAY "true" 
ELSE 
DISPLAY "false" 
END-IF. 

为什么-0.915被使用? COS(3.4E + 38)= -0.93969262078590838405410927732473

+2

我们不能真正回答这个问题。编写代码的人知道(但可能不记得)。外部文档中可能有某些内容(来自业务需求的任何内容)。代码是否过时?自从VS COBOL II Release 3以来,在COBOL中有平方根和余弦的内在函数。对我而言,这些数字过于“接近”,可能会导致浮点值的错误表示。我没有看到尽可能的距离值本身只有三位或四位小数。如果浮点数很差,我们就会真正塞满。 –

+1

COMP-2可以精确地表示15位有效数字。 COMP-2与ARITH(EXTEND)甚至更多。我没有看到COMP-1只给出四位有效数字中的三位的准确性。 –

+1

只要注意到3.4E38作为“浮动”的最大值给出。你真的在大型机上运行吗?最初是为大型机编写的程序吗? z/OS上的浮点值的范围是5.4e-79到7.2e + 75,所以即使它应该是“查看最大值是否工作”,那么它也是关闭的。 –

回答

1

以及逻辑本身是非常简单的,你减去你从SQUAREROOT_ROUTINE得到的结果1.843*(10^19)并把在名为temp的变量值,然后如果该值temp小于1.0*(10^16)您打算向SYSOUT打印出一行“OK”,否则打印出“False”(如果该值等于或大于)。

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

2

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

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

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

你可能会问“为什么让事情变得如此复杂”?问题在于float-values通常不是精确的,并且取决于使用的精度,由于舍入误差,您将看到不同的结果。

+0

先生,非常感谢你的回答,我想问一个类似的问题。 – user143252