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:[email protected]] On Behalf
Of Robert Prins
Sent: Friday, August 4, 2017 2:58 AM
To: [email protected]
Subject: Re: Someone just too smart for his or her own good?
On 2017-08-04 00:31, Charles Mills wrote:
> 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
>
> -----Original Message-----
> From: IBM Mainframe Discussion List [mailto:[email protected]]
> On Behalf Of Robert Prins
> Sent: Thursday, August 3, 2017 12:11 PM
> To: [email protected]
> Subject: Someone just too smart for his or her own good?
>
> Just came across the following, and please don't come back with pedantic
> remarks about undeclared variables, the code is just to show what's there:
>
> 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);
>
> In other words if all a(i) are negative, nothing is printed. A comment in the
> code suggests that this is faster code, on modern OoO z/OS systems, than the
> more logical:
>
> 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
> [email protected]
> Some programming @ <https://prino.neocities.org/zOS/zOS%20Tools.html>
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions, send
> email to [email protected] with the message: INFO IBM-MAIN
>
> ----------------------------------------------------------------------
> For IBM-MAIN subscribe / signoff / archive access instructions, send
> email to [email protected] with the message: INFO IBM-MAIN
>
--
Robert AH Prins
robert(a)prino(d)org
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions, send email to
[email protected] with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN