Doing integer--as opposed to real fixed-point--arithmetic with
packed-decimal values is the real culprit here.

Integer arithmetic should never be done with anything but binary
integers.  Operations on them are register operations, which are much
faster than storage-to-storage ones; and zero is always positive.
Moreover, it is now possible to make them behave in COBOL exactly as
they do in assembly language.

John Gilmore, Ashland, MA 01721 - USA

On 7/14/12, Gibney, Dave <gib...@wsu.edu> wrote:
> Back in 1981, one of the first bugs I had to find/fix was a COBOL (VS?)
> routine intended to distribute the rounding difference to a set of records.
> Perform until zero left to distribute. It looped at negative zero. I didn't
> write it, I don't remember my precise fix.
>
>> -----Original Message-----
>> From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU]
>> On Behalf Of Frank Swarbrick
>> Sent: Friday, July 13, 2012 3:07 PM
>> To: IBM-MAIN@LISTSERV.UA.EDU
>> Subject: Re: COBOL packed decimal
>>
>> Excellent!  Thank you very much!
>> Subtle is right!  :-)
>> Negative zero, huh?  Must be that new math, thing.  :-)
>>
>> Frank
>>
>>
>>
>>
>> >________________________________
>> > From: "Dan Skomsky @ Home" <poodles...@sbcglobal.net>
>> >To: IBM-MAIN@LISTSERV.UA.EDU
>> >Sent: Friday, July 13, 2012 3:24 PM
>> >Subject: Re: COBOL packed decimal
>> >
>> >From an old discussion on the same subject from back in '05 over at
>> >http://www.tek-tips.com :
>> >
>> >Here's an explanation of what is happening.  When we were converting
>> >from VS COBOL to COBOL II/COBOL 370, I found the book "COBOL/370 FOR
>> VS
>> >COBOL AND COBOL II PROGRAMMERS by Harvey Bookman.  Here's what he says
>> >about your question....
>> >
>> >"One change from VS COBOL to COBOL/370 that may seem quite baffling
>> >occurs when a constant or another COMP-3 data field is added or
>> >subtracted to or from a signed COMP-3 data field.  The VS COBOL
>> >compiler produced only an Add Packed (AP) or Subtract Packed (SP)
>> >instruction.  COBOL/370 still produces the same instruction but then
>> >issues a Zero and Add Packed (ZAP) of the resulting field into
>> itself.  The ZAP is executed for a very subtle reason.
>> >When two negative numbers are added together and an overflow occurs,
>> >the overflow flag in the condition code is turned on while the
>> >resulting sign is set as if overflow did not occur.  This means that
>> if
>> >two numbers each defined as PIC S9(03) COMP-3 were added together, and
>> >they had values of -1 and -999 before the addition, the resulting
>> field
>> >would be zero (the digit that overflowed was truncated) with its sign
>> >negative.  The ZAP will preserve the sign of all other computations
>> but
>> >will change a zero with a negative sign to a zero with a positive
>> sign."
>> >
>> >"Ensuring a positive sign in a zero result was not necessary in the VS
>> >COBOL compiler.  This is because the VS COBOL compiler used a Compare
>> >Packed (CP) instruction to compare numeric fields.  It is interesting
>> >that COBOL/370 now often produces a Compare Logical (CLC) instruction
>> >to compare numeric fields.  While this is a faster instruction than
>> CP,
>> >it requires the same sign value for an equal condition to occur.  For
>> >example, a CP instruction will find fields with hexadecimal values
>> '0F'
>> >and '0C' equal, while the CLC will not."
>> >
>> >The same instructions are generated in Enterprise COBOL as were for
>> >COBOL/370.
>> >
>> >HTH
>> >
>> >-----Original Message-----
>> >From: IBM Mainframe Discussion List [mailto:IBM-MAIN@LISTSERV.UA.EDU]
>> >On Behalf Of Itschak Mugzach
>> >Sent: Friday, July 13, 2012 4:10 PM
>> >To: IBM-MAIN@LISTSERV.UA.EDU
>> >Subject: Re: COBOL packed decimal
>> >
>> >Zero and add pack.
>> >
>> >ITschak
>> >
>> >On Sat, Jul 14, 2012 at 12:05 AM, Frank Swarbrick
>> ><frank.swarbr...@yahoo.com
>> >> wrote:
>> >
>> >> COBOL code
>> >> 77  ws-num-packed              pic S9(9) packed-decimal.
>> >>
>> >>     add 2 to ws-num-packed
>> >>
>> >>
>> >> Generated assembler:
>> >>
>> >>
>> >> 000014
>> >> ADD
>> >>    00036A                 GN=16    EQU
>> >> *
>> >>    00036A  FA40 8008 A02C          AP    8(5,8),44(1,10)
>> >>WS-NUM-PACKED                     PGMLIT AT +40
>> >>    000370  F844 8008 8008          ZAP   8(5,8),8(5,8)  WS-NUM-
>> PACKED
>> >>WS-NUM-PACKED
>> >>
>> >>
>> >> What is the purpose of the ZAP?
>> >>
>> >> Thanks,
>> >> Frank
>> >>
>> >>
>> >> --------------------------------------------------------------------
>> -
>> >> - For IBM-MAIN subscribe / signoff / archive access instructions,
>> >> send email to lists...@listserv.ua.edu with the message: INFO
>> >> IBM-MAIN
>> >>
>> >
>> >----------------------------------------------------------------------
>> >For IBM-MAIN subscribe / signoff / archive access instructions, send
>> >email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
>> >
>> >----------------------------------------------------------------------
>> >For IBM-MAIN subscribe / signoff / archive access instructions, send
>> >email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
>> >
>> >
>> >
>>
>> ----------------------------------------------------------------------
>> For IBM-MAIN subscribe / signoff / archive access instructions, send
>> email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions,
> send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN
>

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to