我正在執行一個獨立的企業COBOL程序,計算如下。我有一個計算多個操作和另一個完整的計算分裂。但是在這兩種情況下結果是不同的(最後4位數字)。COBOL COMPUTE計算
我已經使用計算器手動計算了這些值,結果與分割COMPUTE語句的結果相匹配。我已經通過使用中間結果的整個答案來嘗試計算,並且只使用最終答案的15位數字,並且在所有中間步驟(沒有舍入)中也只使用15位數字。但是這些結果中沒有一個與COMPUTE結果相結合。
有人能幫我理解爲什麼會有這樣的差異。
05 WS-A PIC S9(3)V9(15) COMP.
05 WS-B PIC S9(3)V9(15) COMP.
05 WS-C PIC S9(3)V9(15) COMP.
05 WS-D PIC S9(3)V9(15) COMP.
05 WS-E PIC S9(3)V9(15) COMP.
05 WS-RES PIC S9(3)V9(15) COMP.
05 RES-DISP PIC -9(2).9(16).
MOVE 3.56784 TO WS-A.
MOVE 1.3243284234 TO WS-B.
MOVE .231433897121334834 TO WS-C.
MOVE 9.3243243213 TO WS-D.
MOVE 7.0 TO WS-E.
COMPUTE WS-RES = WS-A/WS-B.
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES/WS-C.
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES/(WS-D + WS-E).
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES * (WS-C - WS-A)
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES + WS-E ** WS-B
MOVE WS-RES TO RES-DISP.
COMPUTE WS-RES = WS-RES + WS-D.
MOVE WS-RES TO RES-DISP.
結果最後計算的合併=計算的20.1030727225138740
COMPUTE WS-RES = WS-A/WS-B/WS-C/
(WS-D + WS-E) * (WS-C - WS-A) +
WS-E ** WS-B + WS-D.
MOVE WS-RES TO RES-DISP.
結果= 20.1030727225138680
我已經更新了答案,有一個微妙的指數,我認爲這是你看到的實際問題。通過你所擁有的價值觀和計算,我認爲排序並不重要。想知道爲什麼你沒有診斷信息,我想我已經發現 –
這種特殊情況是當彙編列表(LIST)可以派上用場。理解編譯器生成的代碼可以幫助理解結果。優化也可能會造成偏差,但我相信這將成爲Enterprise COBOL 5.1的更多問題,因爲它使用與C和PL/I相同的代碼生成器。對於「有趣」,我會拿你的原始代碼並比較生成的代碼。您已經從Bill那裏得到了一個很好的答案,並且比較了此處顯示的所有代碼(原始代碼和解決方案)中生成的代碼,這將有助於您更好地理解編譯器的工作方式。 – zarchasmpgmr