View previous topic :: View next topic
|
Author |
Message |
sivasaras
New User
Joined: 29 Sep 2007 Posts: 93 Location: chenna/i-
|
|
|
|
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 |
|
Back to top |
|
|
David Robinson
Active User
Joined: 21 Dec 2011 Posts: 199 Location: UK
|
|
|
|
So you just want the 51 to be stored, ignoring the 2 ??? |
|
Back to top |
|
|
Robert Sample
Global Moderator
Joined: 06 Jun 2008 Posts: 8696 Location: Dubuque, Iowa, USA
|
|
|
|
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). |
|
Back to top |
|
|
Terry Heinze
JCL Moderator
Joined: 14 Jul 2008 Posts: 1249 Location: Richfield, MN, USA
|
|
|
|
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. |
|
Back to top |
|
|
Bill Woodger
Moderator Emeritus
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
|
|
|
|
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. |
|
Back to top |
|
|
Rohit Umarjikar
Global Moderator
Joined: 21 Sep 2010 Posts: 3049 Location: NYC,USA
|
|
|
|
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. |
|
Back to top |
|
|
|