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