Oh geez, well then I rest my case that this code is too clever to be maintainable. The next programmer might not be any smarter than I.

(I'm not a PL/I expert -- I guess "fixed" means packed? I had guessed binary.)

If i is fairly large and there are a good number of a(i) == 0 then my point is still valid -- this has to be an expensive way of doing this.

What is the statement of the problem? What is the snippet supposed to accomplish? "For a table of packed values a[whatever], print the sum of all of the positive values, unless that sum is zero?" Do I have that right?

I would be stunned if the code below performs better than -- and not worse than, assuming a fair number of zero values -- the most obvious logic

for i = 1 to whatever;

if a(i) > 0 then sum = sum + a(i);

end;

if sum > 0 then put data(sum);

Charles

-----Original Message-----

From: IBM Mainframe Discussion List [mailto:IBM-***@LISTSERV.UA.EDU] On Behalf Of Robert Prins

Sent: Friday, August 4, 2017 2:58 AM

To: IBM-***@LISTSERV.UA.EDU

Subject: Re: Someone just too smart for his or her own good?

*Post by Charles Mills*Certainly if one is looking to save a cycle or two then

if a(i) >= 0 then

sum = sum + a(i);

should be

if a(i) > 0 then

sum = sum + a(i);

because adding a(i) to sum when a(i) == 0 is a waste of a cycle or two.

Yes, but in this case it *IS* significant, because the initialization of a PL/I "FIXED (7)" with -1.0 < init-value < 0 will set it to MINUS zero (zero with a

D-sign) and by adding zero to this will normalize the value to have a C-sign.

As I already write in the title, the gal or guy who wrote this code is just a trifle too smart for her or his own good, I've been using PL/I for nearly 32 years, and until I used UNSPEC() on "sum", the code didn't make any sense to me.

FWIW, my original post contained a type,

if substr(unspec(sum), 25, 8) ^= '0d'bx then

should have been

if substr(unspec(sum), 29, 4) ^= 'd'bx then

or, like in the original code,

if substr(unspec(sum), 8*stg(sum)-3, 4) ^= 'd'bx then

Mea culpa, too much Intel assembler where hex constants must start with a zero...

Robert

*Post by Charles Mills*-----Original Message-----

On Behalf Of Robert Prins

Sent: Thursday, August 3, 2017 12:11 PM

Subject: Someone just too smart for his or her own good?

dcl sum fixed (7) init (-0.1);

for i = 1 to whatever;

if a(i) >= 0 then

sum = sum + a(i);

end;

if substr(unspec(sum), 25, 8) ^= '0d'bx then

put data(sum);

dcl sum fixed (7) init (-1);

for i = 1 to whatever;

if a(i) >= 0 then

if sum ^= -1 then

sum = sum + a(i);

else

sum = a(i);

end;

It probably is if the value of whatever is in the order of 42 gazillion, but any other thoughts about this?

Robert

--

Robert AH Prins

----------------------------------------------------------------------

For IBM-MAIN subscribe / signoff / archive access instructions, send

----------------------------------------------------------------------

For IBM-MAIN subscribe / signoff / archive access instructions, send

--

Robert AH Prins

robert(a)prino(d)org

----------------------------------------------------------------------

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

----------------------------------------------------------------------

For IBM-MAIN subscribe / signoff / archive access instructions,

send email to ***@listserv.ua.edu with the message: INFO IBM-MAIN