逻辑
我无法理解什么是这些线背后的逻辑:逻辑
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
以及逻辑本身是非常简单的,你减去你从SQUAREROOT_ROUTINE
得到的结果1.843*(10^19)
并把在名为temp
的变量值,然后如果该值temp
小于1.0*(10^16)
您打算向SYSOUT打印出一行“OK”,否则打印出“False”(如果该值等于或大于)。
如果你的意思是为什么这个代码存在的逻辑,你将需要与代码的作者交谈,但它看起来像一个调试显示,留在程序中。
这些行只是试图测试SQUAREROOT_ROUTINE
返回的结果是否正确。由于该程序使用的是浮点值和相当大的数字,这可能看起来有点复杂。让我们来做数学运算:
从3.4E38开始,squareroot是1.84390889 ... E19。 通过减去1.843E19(即近似结果)并将其与1.0E16进行比较,程序正在测试结果是否在1.843E19和1.843E19 + 1.0E16 = 1.844E19之间。
不是说如果SQUAREROOT_ROUTINE
的结果太低而不是太高,则此测试不会产生错误。要捕获两种类型的错误结果,您应该将差异的绝对值与容差进行比较。
你可能会问“为什么让事情变得如此复杂”?问题在于float-values通常不是精确的,并且取决于使用的精度,由于舍入误差,您将看到不同的结果。
先生,非常感谢你的回答,我想问一个类似的问题。 – user143252
我们不能真正回答这个问题。编写代码的人知道(但可能不记得)。外部文档中可能有某些内容(来自业务需求的任何内容)。代码是否过时?自从VS COBOL II Release 3以来,在COBOL中有平方根和余弦的内在函数。对我而言,这些数字过于“接近”,可能会导致浮点值的错误表示。我没有看到尽可能的距离值本身只有三位或四位小数。如果浮点数很差,我们就会真正塞满。 –
COMP-2可以精确地表示15位有效数字。 COMP-2与ARITH(EXTEND)甚至更多。我没有看到COMP-1只给出四位有效数字中的三位的准确性。 –
只要注意到3.4E38作为“浮动”的最大值给出。你真的在大型机上运行吗?最初是为大型机编写的程序吗? z/OS上的浮点值的范围是5.4e-79到7.2e + 75,所以即使它应该是“查看最大值是否工作”,那么它也是关闭的。 –