我无法理解这些界限背后的逻辑:
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.
答案 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 ; (如果该值等于或大于)。
如果你的意思是为什么这个代码存在的逻辑,你将需要与代码的作者交谈,但它看起来像一个留在程序中的调试显示。