Comments on the Proposed LIA Standard
Dan Zuras
uunet!hpwsdz.cup.hp.com!zuras
Fri Sep 25 14:09:27 PDT 1992
To : Mark Hamilton, Chair, X3T2 Sep. 25, 1992
Netwise, Inc.
2477 55th St.
Boulder, CO, 80301
Cc: Ken Edwards
IBM Corporation - D48/D333
555 Bailey Ave. - POB 49023
San Jose, CA, 95161
Prof. W. Kahan
Computer Science Division
Department of Electrical Engineering
and Computer Science
University of California
Berkeley, CA, 94720
Stacy Alexander stacyacup.hp.com
Ed Barkmeyer edbarkacme.nist.gov
Carl Burch cdbacup.hp.com
Jeff Dawson dawsonardvax.enet.dec.com
Ken Edwards EDWARDSKaSTLVM7.vnet.ibm.com
Mark Hamilton mahanetwise.com
Jerry Huck huckacup.hp.com
Willy McAllister mcallisterahpl.hp.com
Murray x3j3mfacc.bellcore.com
Mary Payne mpayneacrl.dec.com
Liz Peters-Tanaka lizacup.hp.com
Fred Ris risabldvma.vnet.ibm.com
Schaffert schaffertacrl.dec.com
Brian Wickman baw%seg.npl.co.ukansfnet-relay.ac.uk
Dan Zuras zurasacup.hp.com
numeric-intavalidgh.com
ncegacray.com
From: Dan Zuras Re: Language Independent Arithmetic
Hewlett-Packard, 47LA
19447 Prunridge Ave.
Cupertino, CA, 95014
Mr. Chairman :
I have been asked to post my comments on the X3T2 Committee's
Draft International Standard ISO/IEC CD 10967-1:1992 entitled
Information Technology - Language Independent Arithmetic (LIA) -
Part 1: Integer and Floating-Point Arithmetic and formerly
known as LCAS. The version was the Second Committee Draft
(Version 4.0) dated August 31, 1992.
I have divided them up into two sections.
The first section has my general comments and observations.
The second section is the detailed list of comments quoting
chapter and verse from the LIA document.
I thank you in advance for your attention,
Sincerely,
Dan Zuras
General comments and observations on the proposed Language Independent
Arithmetic Standard (LIA) formerly known as LCAS. The version was the
Second Committee Draft (Version 4.0) dated August 31, 1992.
<> I think the most important observation I can make is to
note that LIA chooses to define the word "portability"
differently than most people. Thus, they take directions to
achieve it that most people would regard as contra-indicated.
Portability as most define it is the ability to take a
program that works on one vendor's compiler/OS/hardware/etc.
and compile, link, & run it successfully in another vendor's
environment with little or no changes to the source.
Portability as LIA defines it appears to be something like :
if each vendor I wish to port my program to documents their
arithmetic and language bindings in a reasonably standard way,
I can write a program FOR THAT VENDOR that will do the job I
have in mind.
Under LIA, the more usual definition of portability means that
a programmer may only use those features that are required to
be identical from vendor to vendor.
<> Language bindings are suggested but not required. Thus, an
implementation may comply by providing a subroutine addF(x,y)
which returns the LIA defined sum of two numbers while the
expression x+y performs the vendor's add operation. A vendor
might be motivated to do something like this if their native
operations differed from the LIA in some way.
(Since I wrote up these comments I have been told that the
issue of language bindings is beyond the scope of X3T2. I
leave these and other comments in because I believe it is an
area where a real contribution can be made. Recent work by
the Fortran-90 & NCEG groups show some promise for Fortran & C.
It would be useful for X3T2 to make some contribution beyond
mere repetition of their work. It is important not to be in
conflict.)
<> While LIA states that "A method shall be provided ..." to
obtain various parameters that partially describe a vendor's
floating-point, the method is left up to the vendor. Thus,
while it may be possible to obtain those parameters, each
vendor is free to choose their own method of providing them.
<> It is the stated purpose of LIA that almost all existing
floating-points should comply (the most major exception being
Cray's). Yet, I read LIA as containing clauses that exclude
IEEE-754, IEEE-854, DEC floating-point, & IBM floating-point
(both the 360-style hex format and the RS-6000). Further, it
is possible to define INTEGERS in such a way as to make them
comply as a normalized FLOATING-POINT data type under LIA.
<> LIA is incorrect in stating that systems that meet their
standard have a relative error less than 1 ULP (rnd_error<=1).
It is an intrinsic property of systems without denormalized
numbers that rnd_error >= r^p - 1.
<> The LIA wishes to distance themselves from the Brown model for
some reason. But the model they present is much more like Brown
in its character than it is like IEEE-754. This would not be bad
in and of itself if the model used were both applicable to real
systems and permitted non-trivial inferences to be derived.
Detailed comments and questions on the proposed Language Independent
Arithmetic Standard (LIA) formerly known as LCAS. The version was the
Second Committee Draft (Version 4.0) dated August 31, 1992.
Section 3.2, page 4 : The definition of denormalized is
incorrect. What is really defined here is unnormalized.
Section 4.1, page 6 : "A method shall be provided ..." to
obtain various parameters. This is not stringent enough
for portability.
Section 4.2, page 9 : If you set r = 2^N, p = 1, emin = emax =
1, then Fn = { 0, +/- i | 1 <= i <= 2^N - 1 }, a subset
of the integers, qualifies as a floating-point type!
(with denorm = false or with Fd = {} and denorm = true)
Section 4.2.1, page 10 : The operation absF is deleted but used
elsewhere.
Section 4.2.3, pages 11-12 : The derived constant rnd_error is
not restricted to be <= 1. For any floating-point
system that does not have denormalized numbers, it can
be shown that rnd_err >= r^p - 1.
Proof :
rnd_error is the smallest element of F such that
|x-rndF(x)| <= rnd_error*r^(eF(rndF(x))-p)
for all x in R. Choose x = fmin - eps where
0.5*r^(emin-p) < eps <= r^(emin-p)
On floating-point systems that don't have
denormalized numbers and flush to zero on
underflow, values <= x will flush to zero.
Therefore,
|(fmin-eps)-rndF(fmin-eps)| <=
rnd_error*r^(eF(rndF(fmin-eps))-p)
|(fmin-eps)-0| <= rnd_error*r^(ef(0)-p)
|r^emin-eps| <= rnd_error*r^(emin-p)
|r^emin-r^(emin-p)| <= rnd_error*r^(emin-p)
(r^p-1)*r(emin-p) <= rnd_error*r^(emin-p)
r^p-1 <= rnd_error
This is not a problem with the definition of rnd_error.
It is an intrinsic property of flush to zero in
floating-point systems without denormalized numbers.
Section 4.2.4, page 13 : No system without denormalized numbers
can choose rnd(x) for x<fminN-.5*ULP without incurring a
denormalization error (as defined on page 11). Therefore,
all such systems must return underflow to comply.
Therefore, all systems that return zero don't comply.
Therefore, DEC & IBM (the 360 hex format) don't comply.
(I realize that both DEC and IBM can trap on underflow.
Therefore, the best I can say is that they don't comply
with their default settings. Since this is the setting
that the bulk of the existing portable software has been
written for, it is an important case.)
Section 4.2.5, page 13 : The rather contrived function add*F
appears to be there to allow machines without a guard
digit in their add to comply.
Section 4.2.6, page 14 : Both 754 & 854 return infinity for
1.0/0.0. Therefore, both don't comply. In general,
these arithmetics create values outside those permitted
by LIA (NaNs and infinities) even for operations on
values permitted by LIA (0.0/0.0 and 1.0/0.0). Given
that this is the case, I don't see how 754 & 854 can
ever comply.
(The continuation values on page 18 might be a way out
of this problem. It might be possible to set the IEEE
traps for overflow, underflow & divide-by-zero and write
trap handlers that return values that conform to LIA.
Therefore, the best I can say is that they don't conform
in their default settings. But, just as in the case for
DEC & IBM, this eliminates the case for which the bulk
of portable code has been written.)
Why doesn't exponentF(x) return emin when x=0?
In 754, succ(x) = nextafter(x,+inf) and pred(x) =
nextafter(x,-inf). Therefore, succ(-0) = +0 and
pred(+0) = -0. Not really a violation but it means
that succ & pred are a little tricky around zero.
The function rnF(x,n) rounds up on even. Rather like a
generalization of the Pascal definition of Round(x) to
be Floor(x+0.5). Not really a violation with IEEE since
it is a new operation but, if implemented in hardware,
would require yet another method of rounding in already
complex circuitry.
Section 4.3, page 16 : I don't understand the purpose for the
last paragraph.
All of section 5 : One of the most interesting methods of
notification of exception that I have ever seen was an
implementation of IEEE-754 in Forth. Since Forth is a
language with no notion of either global variables or
implied order of execution, it was not possible to use
global flags and traps. Therefore, the implementors
decided to append 10 bits (5 flags & 5 traps) to each
floating-point number. After an operation, I believe
the resulting traps were the inclusive or of the
operands' traps and the resulting flags were the
inclusive or of the operands' flags together with any
exception that happened on this operation. The final
result was a method of notification in which the trap &
flag state associated with a given value was just that
state that was involved in the creation of that value
and no other.
This very clean method of notification seems to be
outside those considered by LIA. It would be a shame
if functional languages such as Forth, Lisp & APL were
denied this method because of LIA.
Section 6, page 19 : "This standard does not define the syntax
of arithmetic expressions." Therefore, a compliant
function (such as addF) need not be bound to the obvious
language syntax (such as +).
Section A.1.2, page 24 : If Kulish-Miranker arithmetic is
specifically excluded from LIA then so is the arithmetic
on the RS-6000.
The text does not specifically state why K-M is excluded
so I will speculate.
It is possible that LIA does not wish to deal with the
notion of super-accumulators.
I think it more likely that something like the following
is true. Consider the expression
R <-- A*B + C*D
LIA must define this as
R <-- resultF(resultF(A*B,rndF)+resultF(C*D,rndF),rndF)
K-M would define this as (to use LIA's notation)
R <-- resultF(A*B+C*D,rndF)
and the RS-6000 would define this as either
R <-- resultF(A*B+resultF(C*D+0,rndF),rndF)
or
R <-- resultF(resultF(A*B+0,rndF)+C*D,rndF)
according to how the compiler evaluates the expression.
I can see no definition of the pseudo-functions resultF
and rndF that would permit these arithmetics to comply.
Section A.1.3, page 25 : String<->floating-point conversions
are outside the scope of LIA. This is an important
aspect to the portability of any program.
Section A.2.3, page 26 : "The LIA-1 does not define any process
for validating conformity." Can anyone claim compliance?
Section A.4, page 28 : "Each arithmetic type is a subset of the
real numbers characterized by a small number of
parameters." a la Brown.
Section A.4.1.0.2, pages 29-30 : "... 100 decimal digit
integers ..." qualifies as unbound integers. This is
hardly unbound. So long as the integer data type is
bound by some arbitrary limit not associated with runtime
or architectural resources, I would say it is bound.
Section A.4.1.1, page 30 : Since the C integer multiply is
usually modulo the word size, it does not conform to
LIA.
Section A.4.2, page 31 : Five parameters (radix, precision,
emin, emax, denorm) a la Brown.
Section A.4.2.0.1, page 32 : While it is true that addition and
subtraction that results in denormalized numbers is
always exact in IEEE-754 & IEEE-854, it is not true in
an LIA floating-point that includes denormalized
numbers. The add*F function permits a loss of accuracy
due to the lack of a guard digit.
Section A.4.2.0.2, page 33 : The statement that r^(p-1) >= 10^6
assures at least 7 decimal digits of precision is false.
(Counter example : r=2, p=21, 2^20>=10^6 but the
resulting floating-point type has only a little better
than 6 decimal digits of precision.)
The correct statement should be r^p >= 10^7.
Section A.4.2.0.3, page 34 : Eliminating two's-complement
floating-point eliminates the HP 1000 & 3000 floating-
point systems. Even though I work for HP, this doesn't
bother me a great deal. But it does seem to be a
restriction without much gain.
Section A.4.2.0.4, page 35 : Since infinities and NaNs can be
generated from ordinary operands (1.0/0.0, 0.0/0.0),
IEEE-754 & 854 cannot comply in these cases.
Section A.4.2.2, page 36 : <Paragraph (c)> Is this just silly
wording or are they trying to include a case that eludes
me? It can't be for systems with just one zero since
they have been eliminated.
Section A.4.2.2, page 37 : <Paragraph (n)> Not true for 754 &
854. The boolean operation x<y, for example, may trap.
Section A.4.2.5, page 39 : Here is the explanation of that
rather contrived function add*F. It is here to allow
IBM to comply.
Section A.4.2.8, page 41 : The hierarchy presented is meant to
show that LIA is closer to 754 than Brown in its level
of predictability. But the very form of LIA is
Brown-like. So long as the model is useful, I don't
understand why they appear to be distancing themselves
from Brown. Is the LIA model useful? That is, does it
apply to real systems and can one make reasonable
inferences from it? I see no evidence that this is so.
Section A.4.2.9, page 43 : Statement (VI) is only interesting
for multiply and divide. It is seldom true for add and
subtract.
All of Annex B : LIA "suggests" but does not "require" language
bindings. Thus, a vendor may conform by merely
documenting the their implementation of LIA functions
whether they are bound to the language objects or not.
(Since I wrote up these comments I have been told that
the issue of language bindings is beyond the scope of
X3T2. I leave these and other comments in because I
believe it is an area where a real contribution can be
made. Recent work by the Fortran-90 & NCEG groups show
some promise for Fortran & C. It would be useful for
X3T2 to make some contribution beyond mere repetition of
their work. It is important not to be in conflict.)
More information about the Numeric-interest
mailing list