Portal | References | Downloads | Info | Programs | JCLs | Mainframe wiki | Quick Ref

Author Message
sivasaras

New User

Joined: 29 Sep 2007
Posts: 93
Location: chenna/i-

 Posted: Tue Jan 06, 2015 9:33 pm    Post subject: Computing statement truncation Hi, I have a compute statement in my cobol code. A PIC X(02) MOVE 32 TO A. C PIC 9(2) COMPUTE C = 16 * A value is 512 but it is storing the value as 12 not 51. please help me how to store the first 2 numbers. Thanks

David Robinson

Active User

Joined: 21 Dec 2011
Posts: 197
Location: UK

 Posted: Tue Jan 06, 2015 9:54 pm    Post subject: So you just want the 51 to be stored, ignoring the 2 ???
Robert Sample

Global Moderator

Joined: 06 Jun 2008
Posts: 8560
Location: Dubuque, Iowa, USA

 Posted: Tue Jan 06, 2015 9:56 pm    Post subject: If the PIC clause is too small to hold the result, COBOL aligns to the decimal point (whether explicit or implicit). Your C variable has an implicit decimal point after the second digit, hence the 12 will be stored and the 5 dropped. The easiest way to capture the 51 would be to define C as PIC 9(03) and then REDEFINE a variable on C that is PIC X(02).
Terry Heinze

JCL Moderator

Joined: 14 Jul 2008
Posts: 1249
Location: Richfield, MN, USA

 Posted: Tue Jan 06, 2015 10:42 pm    Post subject: It can be dangerous using a PIC X (alphanumeric) field in a calculation. I'd either redefine it as numeric, or better yet, define A as numeric. Also, read very carefully the section in the Programming Language Manual about the precision of intermediate results when using the COMPUTE statement. COBOL doesn't do what you might expect it to.
Bill Woodger

Moderator Emeritus

Joined: 09 Mar 2011
Posts: 7312
Location: Inside the Matrix

 Posted: Tue Jan 06, 2015 11:02 pm    Post subject: Reply to: Computing statement How did you use a PIC X(2) as a source field in a COMPUTE? Why would you expect 51 to be the answer? I'm not sure I know of any programming language which right-truncates results to fit in a field. For an answer, you can also truncate your result by dividing by 10. Not normally something I recommend, but since you are multiplying by 16 already, why don't you multiply instead by 1.6? Terry, It obviously took me 20 minutes to type that amongst other things. The PIC X definition for A will cause the compiler to upchuck and refuse to even attempt the COMPUTE. COMPUTE works exactly how it should work. The problem people have with COMPUTE is that they don't read the intermediate results section that you suggested. They tend to think of a computer as a big calculator, or something which uses numbers-of-unlimited-size-and-unlimited-decimal-places-even-though-it-can't-do-decimal-calculations-accurately-in-all-cases.
Rohit Umarjikar

Global Moderator

Joined: 21 Sep 2010
Posts: 2467
Location: NY,USA

Posted: Thu Jan 08, 2015 3:42 am    Post subject:

 Quote: value is 512 but it is storing the value as 12 not 51

Red Alram--> Is it a bug or a requirement? if bug then simply increase the size of C otherwise use the above methods as suggested.
 All times are GMT + 6 Hours
 Page 1 of 1

Search our Forum:

 Topic Author Forum Replies Posted Similar Topics Required Date Format in Include Sort ... vivky_vivek DFSORT/ICETOOL 6 Fri Aug 14, 2020 6:52 am CALL statement in COBOL for VSE Kirthishine COBOL Programming 3 Fri Jun 26, 2020 12:12 pm ISPF skeleton that has IF/THEN/DO sta... ecsk TSO/ISPF 15 Mon Apr 27, 2020 12:52 pm Usage of pre-processor statement in p... Sakthidevi PL/I & Assembler 1 Thu Nov 28, 2019 4:08 pm Usage of Like statement in PL/I Sakthidevi PL/I & Assembler 3 Fri Nov 15, 2019 11:22 pm

 © 2003-2020 IBM MAINFRAME Software Support Division
 Job Vacancies | Forum Rules | Bookmarks | Subscriptions | FAQ | Polls | Contact Us