Hi, On Thu, 8 Jul 2004 08:45:36 -0700, Fargusson.Alan wrote: > This triggered a long forgotten memory. I don't know PL/1 syntax, but the problem > goes something like this: > declare x as two digits; > declare y as two digits; > declare z as three digits; > x = 30; > y = 70; > z = x + y; > > At this point z is zero because the add of x and y is done with two digits of > accuracy. > ...
All PL/1 implementations I know use for the intermediate result of fixed(p1,q1) +/- fixed(p2,q2) q = max(q1,q2) p = 1 + max(p1-q1,p2-q2) + q p may be limited due to harware capability. In this case the program should catch an exception - if not disabled. With floating point operands the smaller may be neglected if the difference in exponent magnitude exeeds mantissa length. But thats not PL/1. It depends on the harware. = intermediate_ for fixed point I think that the rule is that the add is done in the size of the largest item, which is two in my example. I was going to say that the compiler should warn about this, but I don't see how it could, knowing how parsing of the expression is done. > > There is a similar problem with COBOL, but COBOL programmers do this: > > move 30 to x. > move 70 to y. > > move x to z. > add y to z. > > This results in the add being done in three digits. COBOL programmers avoid the > compute statement because it would have the same result as the PL/1 example. > > -----Original Message----- > From: Nix, Robert P. [mailto:[EMAIL PROTECTED] > Sent: Wednesday, July 07, 2004 7:04 AM > To: [EMAIL PROTECTED] > Subject: Re: Progress on PL/1 for Linux > > > The demonstration I was given used three variables, all falling to the default > definitions (it's been too long to remember the specific letters used; sorry). Two > of the variables are assigned very large values, and the third is set to a very > small value, all positive. The three variables are added together to return a > result. Because of the intermediate temporary variables selected by PL/I to store > the partial results, both ends of the resulting value are truncated, leaving zero. > There is no error or warning; you just get a zero result, even though the result > could have been correctly represented had better intermediates been chosen. > > You can get this to happen in many languages... just not as readily. Most make > better choices of intermediate variables, and most warn you when something like this > happens at runtime, or at least let you trap the error if you desire. > > ---- > Robert P. Nix internet: [EMAIL PROTECTED] > Mayo Clinic phone: 507-284-0844 > RO-CE-8-857 page: 507-270-1182 > 200 First St. SW > Rochester, MN 55905 > ---- "Codito, Ergo Sum" > "In theory, theory and practice are the same, > but in practice, theory and practice are different." > > > > > -----Original Message----- > > From: Linux on 390 Port [SMTP:[EMAIL PROTECTED] On Behalf Of Henry Schaffer > > Sent: Wednesday, July 07, 2004 8:56 AM > > To: [EMAIL PROTECTED] > > Subject: Re: Progress on PL/1 for Linux > > > > It's been a very long time since I last used PL/I, but I don't > > remember anything about its arithmetic which would give this result. > > IIRC it basically used the underlying 360/370 hardware for arithmetic. > > > > Could you say more about this intriguing error? > > > > --henry schaffer > > > > > > ---------------------------------------------------------------------- > For LINUX-390 subscribe / signoff / archive access instructions, > send email to [EMAIL PROTECTED] with the message: INFO LINUX-390 or visit > http://www.marist.edu/htbin/wlvindex?LINUX-390 > > ---------------------------------------------------------------------- > For LINUX-390 subscribe / signoff / archive access instructions, > send email to [EMAIL PROTECTED] with the message: INFO LINUX-390 or visit > http://www.marist.edu/htbin/wlvindex?LINUX-390 --- Albert ---------------------------------------------------------------------- For LINUX-390 subscribe / signoff / archive access instructions, send email to [EMAIL PROTECTED] with the message: INFO LINUX-390 or visit http://www.marist.edu/htbin/wlvindex?LINUX-390