               C Version of the Code & Waite
          ELEFUNT Elementary Function Test Package
                        [15-Jun-87]

This C version of the ELEFUNT test package was translated by
Ken Stoner (GU.STONER@SCIENCE.UTAH.EDU) and Nelson H.F.
Beebe (BEEBE@SCIENCE.UTAH.EDU) at the Center for Scientific
Computing, Department of Mathematics, University of Utah.
The translation was carried out by converting the original
FORTRAN code to Ratfor automatically with the Unix struct
utility, then hand editing the Ratfor to C, which resemble
one another.

Considerable care has been taken to match the output format
of the two versions, so that after the characters
+-0123456789 have been converted to blanks, the output
listings should substantially agree.  One error was
corrected in FORMAT 1030 in TPOWER--a missing right
parenthesis.  The FORTRAN version has some inconsistencies
in the number of blank lines used for spacing the output; we
have opted in favor of uniformity in the C version.

C is problematic for numerical work on several grounds:
        * Parentheses in expressions cannot be used to
          enforce evaluation order; temporary variables must
          be introduced.  This was particularly a problem in
          machar.c.
        * C has float and double data types, but an
          implementation is free to implement these
          in the same precision (PCC-20 uses only single
          precision); the run-time library is written only
          in type double.
        * The behavior of library functions with respect to
          out-of-range arguments, or arguments which would
          result in substantial accuracy loss, is not
          standardized.  Most C run-time libraries simply
          set the global error value "errno" to a non-zero
          value and return an arbitrary function result.
          Code to test errno has been added to the test
          programs.
        * The behavior of floating-point arithmetic in
          response to  underflow or overflow is not
          well-defined.

In addition, machines with IEEE arithmetic (which is
provided by most newer architectures) place additional
demands on numerical software because they have
computational units of greater precision than is stored in
memory.  For example, several implementations compute with
80-bit extended precision, but store 32-bit or 64-bit values
in memory.  Code in machar is particularly sensitive to
this, and it has been necessary to force memory stores in
intermediate expressions by calling a function
store(&memval).  Since the address of a memory location is
passed to store(), that location can potentially be
modified, and the caller of store() must then reload the
memory value upon return, rather than using a value that
might exist in a higher-precision register.

The C version has been written using type "float"; the
Makefile's for it provide an implicit "#define float double"
for those systems in which the two precisions are
implemented differently, so that the tests are carried out
at the precision of the run-time library.
