У меня есть эта очень простая фиктивная программа COBOL, которая делает фиктивный COMPUTE и отображает результат.
ID DIVISION.
PROGRAM-ID. DUMMYPGM.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NUM-A PIC 9(3) VALUE 399.
01 NUM-B PIC 9(3) VALUE 211.
01 NUM-C PIC 9(3).
*
PROCEDURE DIVISION.
MAIN.
COMPUTE NUM-C = ((NUM-A / 100) - (NUM-B / 100)) * 100
DISPLAY 'NUM-C IS ' NUM-C
STOP RUN.
Когда я компилирую этот код на мейнфрейме (с компилятором MVS Enterprise COBOL V4.2) и выполняю его, я получаю "NUM-C IS 100", вероятно, потому что (399/100) рассматривается как 3 вместо 3.99 в расчете (а также для 211/100).
Но когда я компилирую тот же точный код на ПК (с компилятором GnuCobol) и выполняю его, я получаю "NUM-C IS 188". Ответ ПК правильный, но я бы хотел, чтобы он вел себя как мэйнфрейм (и, таким образом, терял точность в этом вычисляемом выражении, чтобы дать 100 вместо 188)... Как мне это сделать?
Причиной этого является общее выражение этого кода:
COMPUTE PDISCR = (((((X(1) + DX - XBRAK) * (ABRAK(1) / 1000)) / 100)
+ PHT(1) + DPH - PHBRAK) * 2) + ((V(1) + DV
+ VBRAKMPM) * (V(1) + DV - VBRAKMPM) / 100000))
Это часть 50-летней программы моделирования поездов, которую мне нужно перенести на GnuCOBOL. Все поля, используемые в COMPUTE, являются целыми числами. Мне нужно получить тот же ответ от GnuCOBOL.
Подтверждено для OpenCOBOL/GnuCOBOL до 2.0.