2016-10-04 7 views
10

나는 더미 COMPUTE를 수행하고 결과를 표시하는 아주 간단한 더미 COBOL 프로그램을 가지고 있습니다. I는 (컴파일러 MVS 엔터프라이즈 COBOL V4.2)와 메인 프레임에이 코드를 컴파일하고 실행할 때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. 

는 아마도 때문에 (100분의 399)가 취급되는 "NUM-C는 100"GET 계산에서 3.99 대신 3을 사용합니다 (211/100도 마찬가지).

그러나 동일한 정확한 코드를 GnuCobol 컴파일러로 PC에서 컴파일하고 실행하면 "NUM-C IS 188"이됩니다. PC의 대답은 정확하지만 메인 프레임처럼 동작하도록하고 싶습니다. (따라서 188 대신 100을주는 계산 문에서 정밀도를 잃어 버립니다 ...) 어떻게하면됩니까?

COMPUTE PDISCR = (((((X(1) + DX - XBRAK) * (ABRAK(1)/1000))/100) 
        + PHT(1) + DPH - PHBRAK) * 2) + ((V(1) + DV 
        + VBRAKMPM) * (V(1) + DV - VBRAKMPM)/100000)) 

이 내가 GnuCOBOL로 마이그레이션해야하는 50 세의 기차 시뮬레이션 프로그램의 일부입니다

위의 이유는이 코드의 일반적인 표현이다. COMPUTE에 사용 된 모든 필드는 정수입니다. 나는 GnuCOBOL에서 같은 대답을 얻을 수 있어야합니다.

최대 2.0까지의 OpenCOBOL/GnuCOBOL에 대해 확인되었습니다.

+0

오해를 불러 와서 미안합니다. 복잡한 것은 하나의 계산으로 몇 가지 연산을 의미합니다 (여기에는 2 개의 division과 하나의 연산 대신 하나의 곱셈이 있음). 나는이 코드가별로 좋지 않다는 것을 알고 있지만 개념의 증거 일뿐입니다. 나는 전혀 우월하거나 무엇이든지 소리 치기를 원했기 때문에 나는 내 글을 편집했다. –

+0

GnuCOBOL 릴리스는 cobc -V를 썼고 다음과 같이 표시했습니다. cobc (OpenCOBOL) 1.1.0 Copyright (C) 2001-2009 Keisuke Nishida/Roger While Built Sep 10 2010 10:12:33 포장 된 2 월 06 2009 10:30:55 CET –

+0

나는 가능한 해결책이 다른 정수 변수에서 계산의 모든 단계를 분리하는 것이지만보다 나은 해결책을 찾고 싶다. 왜냐하면 여기에있는 코드에서 COMPUTE 문을 예로 들었기 때문이다. 작업중 : COMPUTE PDISCR = ((((1) + DX-XBRAK) * (ABRAK (1)/1000)) /100) + PHT (1) + DPH-PHBRAK) * 2) + (V (1) + DV + VBRAKMPM) * (V (1) + DV - VBRAKMPM)/100000)) –

답변

0

IBM이 값을 자르고 GnuCobol이 잘리지 않으므로 GnuCobol 기능을 사용하여 IBM이 수행하는 방식을 에뮬레이트 할 수 있습니다. I (1) DOCO 그것보다는 음의 무한대 방향으로 라운드 나타 내기 위해 보이기 때문에이 음의 정수 작동 여부를 테스트하지 않았습니다

COMPUTE NUM-C = ((INTEGER(NUM-A/100)) - (INTEGER(NUM-B/100))) * 100 

: 적어도 양의 정수를 들어

, 그건 아마로 간단합니다 제로; (2) TRUNCATE 함수가없는 것 같습니다. (3) 데이터 유형이 서명되지 않았으므로 신경 쓰지 않는다고 가정했습니다.

이 네거티브를 처리해야하는 경우, 그것을 수행 할 수학적 방법이 있습니다. 다른 질문으로 제안하는 것이 좋습니다.