ieetst, version 0.2

   This software tests the numerical accuracy of floating point
binary <-> decimal string conversion, as done by your C language
library functions printf() and scanf(), for compliance with the
IEEE arithmetic standards ANSI/IEEE Std 754-1985 and ANSI/IEEE
Std 854-1987.  The test covers 32-bit float, 64-bit double, and
80-bit long double precision conversions to and from decimal
ASCII strings.

   The test program checks for proper implementation of the
following specifications of the standards:

   (1) correctly rounded conversions of numbers of the form M *
   10^N, where M and N are integers such that, in double precision,
   for example, |M| < 10^17, |N| <= 27.

   (2) binary -> decimal -> binary conversions to be an identity
   if a sufficiently large number of decimal digits is requested.

   (3) correctly rounded decimal outputs of less than the maximum
   number of digits

   (4) The maximum observed conversion error of numbers outside the
   domain covered by (1) is reported by the test program; it is
   not supposed to exceed 0.97 ulp.

There are 10 separate tests.  Tests 1 through 6 use values near
2^n and 10^n.  Test 7 addresses item (1) above.  Test 8 checks
the rounding of exact half-integer numbers. Test 9 is for item
(4) above.  Test 10 checks denormal numbers.  Tests 8 through 10
address item (3) using printf formats that produce outputs of 1,
2, 3, ... digits after the decimal point.  All tests check, when
appropriate, that the binary output of scanf is the same as the
binary input to printf, item (2).

Example error messages:

   0000 0000 0000 1000 8000 3f80 ->printf-> 5.87748296e-39 ->scanf->
   0000 0000 0000 0000 8000 3f6e  is not an identity.

   scanf(-9.9999900000000003e-01) -> 0000 4800 085f ef39 ffff bffe 
   should be 0000 5000 085f ef39 ffff bffe .

   printf("%.14e",  6.13592315154256467968352E-3) -> 6.13592315154257e-03
   should be       6.13592315154256E-3 .

Binary values are displayed as four-digit hex groups in the
little-endian format of the internal reference arithmetic. The
least significant 16-bit word is first, the exponent is last.

   The design of the test program requires knowing the binary
data structure of the floating point format under test.  For
configuration, check the .h files carefully. All the programs
need to be told via mconf.h if the numeric format is
little-endian (IBMPC) or big-endian (MIEEE).  If your system
supports an 80-bit long double precision data type, define
LDOUBLE 1 in ieetst.c; otherwise define LDOUBLE 0.  A provision
for DEC PDP-11/VAX numbers is implemented (double precision
only).  Conversions for other data structures can be added by
analogy to the ifdefs for DEC.

   Most of the tests rely on comparison with the results of a
portable reference arithmetic, contained in the file ieee.c. 
This is configured for an 80-bit significand, to have enough
precision to satisfy the conversion requirements of IEEE 854 for
the extended double format of IEEE 754.  The reference arithmetic
includes binary <--> ASCII conversion routines and single <-->
double <--> extended double conversions.  A strictly rounded
square root function is given in esqrt.c.  Additional functions
are provided by elog.c, eexp.c, etanh.c, epow.c, all of which
call on ieee.c for their arithmetic.  Some of the ANSI C
functions are supplied in ieee.c; for example, efloor(),
efrexp(), eldexp(). The functions and the reference arithmetic
are described further in the book _Methods and Programs for
Mathematical Functions_ (Prentice-Hall or Simon & Schuster
International, 1989), by S. L. Moshier.

   As an aid in diagnosis, a calculator program, ecalc.c, is
supplied.  It uses ieee.c for its arithmetic. Documentation for
the calculator's user interface is in the file calc100.doc
(calc100 is a fuller featured 100-digit version of ecalc).  The
calculator needs to be told by qcalc.h if addresses are 32 bits
long (define LARGEMEM 1) or 16 bits long (define LARGEMEM 0).

   Because the source code of ieee.c is included here, a version
of W. Kahan's PARANOIA is also provided; this has been heavily
modified by substituting subroutine calls to ieee.c in place of
all arithmetic operators.  It is important that you use PARANOIA
to check the arithmetic after any modifications you may make to
ieee.c.

   Several systems have been tested with the initial version of
ieetst.  Sun 4 (SPARC) passes; DEC VMS C has only a small flaw;
Microsoft flunks; ATT SysVR2 (Motorola) flunks even worse.


   Files:

calc100.doc     calculator documentaton
descrip.mms     part of VAX VMS makefile
drand.c         random number generator
ecalc.c         calculator
ecalc.opt       part of VAX VMS makefile
econst.c        constants for reference arithmetic
eexp.c          reference exponential function
ehead.h         declarations for reference arithmetic routines
elog.c          reference logarithm
eparanoi.c      floating point arithmetic tester
eparanoi.opt    part of VAX VMS makefile
epow.c          reference exponentiation
esqrt.c         reference square root
etanh.c         reference hyperbolic tangent
etodec.c        conversions to and from DEC double precision format
ieee.c          the reference arithmetic
ieetst.c        printf/scanf tester
ieetst.doc      this file
ieetst.mak      Microsoft make file
ieetst.opt      part of VAX VMS makefile
makefile        Unix make file
mconf.h         definitions for arithmetic format
mtherr.c        common error reporter
qcalc.h         definitions for calculator


This software may be copied freely.

-- Steve Moshier

v0.1   July, 1992
v0.2   January, 1993