123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- 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
|