邏輯

2017-02-27 81 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