From: S_JUFFA@iravcl.ira.uka.de (|S| Norbert Juffa)
Newsgroups: comp.sys.ibm.pc.hardware,comp.sys.intel
Subject: What you always wanted to know about math copros 4/5
Date: 28 Sep 1992 14:10:34 GMT
Organization: University of Karlsruhe (FRG) - Informatik Rechnerabt.
Distribution: world
NNTP-Posting-Host: irav1.ira.uka.de
X-News-Reader: VMS NEWS 1.23

         Accuracy

         The IEEE-754 Standard for Binary Floating-Point Arithmetic [10,11]
         is fully implemented by Intel's 387 coprocessor [17]. Among other
         things, this means that the add, subtract, multiply, divide,
         remainder, and square root operations always deliver the 'exact'
         result. By exact it is meant that the coprocessor always delivers
         the machine number closest to the real result, which may not
         be representable exactly in the available numeric format. The
         80387 implements the single, double, and double extended formats
         as specified in the standard as well as all functions required
         by it [17]. Note that earlier Intel coprocessors (the 8087 and
         the 80287) comply with a draft version of the standard that differs
         from the final version. These chips came out before the IEEE-754
         standard was finally accepted in 1985. As in the 80387, the basic
         arithmetic in the 8087 and the 80287 is exact in the sense that
         the computed result is always the machine number closest to the
         real result. However, there are some differences regarding certain
         operands like infinities and some operations like the remainder are
         defined differently. Some instructions have been added in the 80387,
         most notably the FSIN and FCOS operations. The argument range for
         some transcendental function has been extended [17]. Note that the
         IEEE-754 standard says nothing about the quality of the implementation
         of transcendental functions like sin, cos, tan, arctan, log. Intel
         uses a modified CORDIC [18,19] technique to compute the transcendental
         functions. Intel claims that maximum error in the 8087, 80287, and
         80387 for all transcendental functions does not exceed two bits
         in the mantissa of the double extended format, which features 64
         mantissa bits for an accuracy of approximately 19 decimal places
         [22,23]. This claim has been independently verified by a competing
         vendor [13]. This means that at least 62 of the 64 mantissa bits
         in a transcendental function result are correct.

         The Weitek Abacus 3167 and 4167 are 'mostly compatible' with
         IEEE-754 [31,32,33]. They support the single precision and double
         precision numeric formats described in the standard as
         well as the four rounding modes required by it. However, due to
         the need for extremely high speed operation, some of the finer
         points of IEEE-754 have not been implemented. One of the most
         notable omissions is the missing support for denormal numbers.
         Denormals are always flushed to zero.

         The 387 clone makers claim 100% compatibility with Intel's 80387.
         So one would expect the same accuracy from their chips. For example,
         on the packaging of the IIT 3C87 it says that ".. the requirements
         of ANSI/IEEE standards are fulfilled and exceeded". Cyrix states
         that their 83D87 complies fully with the IEEE-754 standard [12].
         Cyrix delivers with their coprocessors some diagnostic software.
         This includes the program IEEETEST which is based on the IEEE test
         vectors from the Ph.D. thesis of Jerome T. Coonen [9]. A test using
         the IEEE test vectors has also been included into the RUNDIAG
         program on the Intel RapidCAD diagnostic disk. Rather than performing
         random tests, the test vectors check specific cases that may
         be hard to get right. Each test vector specifies the operation
         to be performed, the operands, precision and rounding mode to be
         used, and the result (including flags set) to be expected according
         to IEEE-754. I ran IEEETEST on all the available coprocessors/FPUs.
         The Intel 486, Intel RapidCAD, Intel 387, Intel 387DX, Cyrix 83D87,
         and the Cyrix 387+ passed with no errors. The ULSI 83C87 showed
         some minor flaws in the FCOM, FDIV, FMUL, and FSCALE operations,
         getting flag errors in about 1% of the tested cases, but no
         computational errors. However, for the IIT 3C87, the IEEETEST
         program showed flag *and* some computational errors (that is, wrong
         results) for all tested operations except FXTRACT and FCHS. The Intel
         80287 shows numerous errors, but this it not surprising, since the
         80287 does not comply with IEEE-754 but with an earlier draft of that
         standard, so it does some thing differently than required by the final
         version of the standard.

         Although IEEETEST is written in Turbo Pascal, the coprocessor
         emulator in the TP 6.0 library could not be tested since IEEETEST
         was compiled with the $E- switch excluding the emulator from
         program code. The public domain emulator EM87 could be tested, but
         hung in the last test which checks the implementation of the
         remainder operation. This is probably caused by some bug in the
         emulation of the FPREM instruction tested in this test. It is
         interesting to note how the error profile of EM87 matches exactly
         that of the Intel 80287, so it can be assumed that EM87 is a very
         good emulation of the 80287. The Franke387 V2.4 emulator hung in
         the division test quite early in IEEETEST. The tests performed
         up to the division test reported several errors.



         Explanatory text printed at the start of the IEEETEST program:

         JT Coonen's 1984 UC Berkeley Ph.D. thesis centers around his
         activities as a member of the floating-point working group that
         defined the IEEE 754-1985 Standard for Binary Floating-Point
         Arithmetic. Appendix C of his thesis presents FPTEST, a Pascal
         program written by J Thomas and JT Coonen. IEEETEST is a port of
         FPTEST and runs on PCs whose math coprocessor accepts 80387
         compatible floating-point instructions.

         IEEETEST reads test vectors from the file TESTVECS and compares
         the answer returned by the math coprocessor with the answer listed
         in the test vector. If these answers differ an 'F' is displayed,
         otherwise a '.'is displayed. Answers can differ due to two types
         of failures: numeric failures or flag failures. Numeric failures
         occur when the computed answer has the wrong value. Flag failures
         occur when the status (invalid operation, divide by zero, underflow,
         overflow, inexact) is incorrectly identified.

         TESTVECS is the concatenation of unmodified versions of all the
         test vectors distributed by UC Berkeley. The test data base is
         copyrighted by UC Berkeley (1985) and is being distributed with
         their permission. FPTEST and the test data base can be obtained
         by asking for 'IEEE-754 Test Vector' from UC Berkeley, Electrical
         Engineering and Computer Science, Industrial Liaison Program,
         479 Corey Hall, Berkeley, CA, 94720 (415)643-6687.

         The initial version of this test data base for the proposed IEEE
         754 binary floating-point standard (draft 8.0) was developed for
         Zilog, Inc. and was donated to the floating-point working group
         for dissemination. Errors in or additions to the distributed data
         base should be reported to the agency of distribution, with copies
         to Zilog, Inc., 1315 Dell Avenue, Campbell, CA, 95008.


         IEEETEST output for Intel 80387, Intel 387DX (manufactured 91/49),
                             Intel 486, C&T 38700 (manufactured 92/19),
                             Cyrix 83D87, Cyrix 387+ (manufactured 92/11),
                             Intel RapidCAD (manufactured 92/05)

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    216      0 |    0    0    0 |   0    0    0
                 Addition    + |   3528      0 |    0    0    0 |   0    0    0
               Comparison    C |   4320      0 |    0    0    0 |   0    0    0
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   4311      0 |    0    0    0 |   0    0    0
            Fraction Part    F |    624      0 |    0    0    0 |   0    0    0
                     Logb    L |    960      0 |    0    0    0 |   0    0    0
           Multiplication    * |   3978      0 |    0    0    0 |   0    0    0
                 Negation    - |    216      0 |    0    0    0 |   0    0    0
               Next After    N |   2832      0 |    0    0    0 |   0    0    0
         Round to Integer    I |    558      0 |    0    0    0 |   0    0    0
                    Scalb    S |    948      0 |    0    0    0 |   0    0    0
              Square Root    V |    744      0 |    0    0    0 |   0    0    0
              Subtraction    - |   3528      0 |    0    0    0 |   0    0    0
                Remainder    % |   2984      0 |    0    0    0 |   0    0    0
                        Totals |  31235      0 |


         IEEETEST output for ULSI 83C87 (manufactured 91/48)

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    216      0 |    0    0    0 |   0    0    0
                 Addition    + |   3528      0 |    0    0    0 |   0    0    0
               Comparison    C |   4312      8 |    0    0    0 |   0    0    8
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   4250     61 |    0    0    0 |  28   28    5
            Fraction Part    F |    624      0 |    0    0    0 |   0    0    0
                     Logb    L |    960      0 |    0    0    0 |   0    0    0
           Multiplication    * |   3936     42 |    0    0    0 |  19   19    4
                 Negation    - |    216      0 |    0    0    0 |   0    0    0
               Next After    N |   2828      4 |    0    0    0 |   0    0    4
         Round to Integer    I |    558      0 |    0    0    0 |   0    0    0
                    Scalb    S |    930     18 |    0    0    0 |   6    6    6
              Square Root    V |    744      0 |    0    0    0 |   0    0    0
              Subtraction    - |   3528      0 |    0    0    0 |   0    0    0
                Remainder    % |   2984      0 |    0    0    0 |   0    0    0
                        Totals |  31102    133 |


         IEEETEST output for ULSI 83S87 (manufactured 92/17)
         (data kindly supplied by Bengt Ask, f89ba@efd.lth.se)

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    216      0 |    0    0    0 |   0    0    0
                 Addition    + |   3528      0 |    0    0    0 |   0    0    0
               Comparison    C |   4320      0 |    0    0    0 |   0    0    0
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   4296     15 |    0    0    0 |   5    5    5
            Fraction Part    F |    624      0 |    0    0    0 |   0    0    0
                     Logb    L |    960      0 |    0    0    0 |   0    0    0
           Multiplication    * |   3966     12 |    0    0    0 |   4    4    4
                 Negation    - |    216      0 |    0    0    0 |   0    0    0
               Next After    N |   2828      4 |    0    0    0 |   0    0    4
         Round to Integer    I |    558      0 |    0    0    0 |   0    0    0
                    Scalb    S |    930     18 |    0    0    0 |   6    6    6
              Square Root    V |    744      0 |    0    0    0 |   0    0    0
              Subtraction    - |   3528      0 |    0    0    0 |   0    0    0
                Remainder    % |   2984      0 |    0    0    0 |   0    0    0
                        Totals |  31102     45 |


         IEEETEST output for IIT 3C87 (manufactured 92/20)

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    200     16 |    0    0   16 |   0    0    0
                 Addition    + |   3336    192 |    0    0  128 |   0    0   96
               Comparison    C |   4224     96 |    0    0   96 |   0    0    0
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   4159    152 |    0    0  124 |   0    0  116
            Fraction Part    F |    600     24 |    0    0   24 |   0    0   24
                     Logb    L |    960      0 |    0    0    0 |   0    0    0
           Multiplication    * |   3702    276 |    0    0  248 |   0    0  100
                 Negation    - |    200     16 |    0    0   16 |   0    0    0
               Next After    N |   2248    584 |    0    0  584 |   0    0  168
         Round to Integer    I |    542     16 |    0    0    4 |   0    0   16
                    Scalb    S |    874     74 |    5    5   44 |   8    8   20
              Square Root    V |    688     56 |    0    0   56 |   0    0   56
              Subtraction    - |   3336    192 |    0    0  128 |   0    0   96
                Remainder    % |   2844    140 |    0    0  140 |   0    0  116
                        Totals |  29401   1834 |


         IEEETEST output for Intel 80287 run together with a 80386 CPU

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    216      0 |    0    0    0 |   0    0    0
                 Addition    + |   2886    642 |   16   16  112 | 174  174  174
               Comparison    C |      0   4320 | 1324 1324 1324 |1332 1332 1332
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   3777    534 |   18   18   37 | 169  169  165
            Fraction Part    F |    552     72 |   24   24   24 |  24   24   24
                     Logb    L |    900     60 |   12   12   12 |  20   20   20
           Multiplication    * |   2944   1034 |  105  105  197 | 303  303  231
                 Negation    - |    216      0 |    0    0    0 |   0    0    0
               Next After    N |    348   2484 |  768  768  768 | 504  504  526
         Round to Integer    I |    546     12 |    0    0    0 |   4    4    4
                    Scalb    S |    663    285 |   45   43   26 | 102   98   46
              Square Root    V |    720     24 |    4    4    4 |   8    8    8
              Subtraction    - |   2886    642 |   16   16  112 | 174  174  174
                Remainder    % |    708   2276 |  768  768  560 | 216  216  216
                        Totals |  18850  12385 |


         IEEETEST output for EM87 coprocessor emulator run on an Intel 386 CPU

         IEEE-754 Test Vector  Precisions: S=Single D=Double E=Double Extended
                               |     TESTS     | numeric TYPE OF FAILURE flag
                Operation Code | Passed Failed |    S    D    E |   S    D    E
         ----------------------------------------------------------------------
           Absolute Value    A |    216      0 |    0    0    0 |   0    0    0
                 Addition    + |   2886    642 |   16   16  112 | 174  174  174
               Comparison    C |      0   4320 | 1324 1324 1324 |1332 1332 1332
                Copy Sign    @ |   1488      0 |    0    0    0 |   0    0    0
                 Division    / |   3777    534 |   18   18   37 | 169  169  165
            Fraction Part    F |    552     72 |   24   24   24 |  24   24   24
                     Logb    L |    900     60 |   12   12   12 |  20   20   20
           Multiplication    * |   2944   1034 |  105  105  197 | 303  303  231
                 Negation    - |    216      0 |    0    0    0 |   0    0    0
               Next After    N |    348   2484 |  768  768  768 | 504  504  526
         Round to Integer    I |    546     12 |    0    0    0 |   4    4    4
                    Scalb    S |    663    285 |   45   43   26 | 102   98   46
              Square Root    V |    720     24 |    4    4    4 |   8    8    8
              Subtraction    - |   2886    642 |   16   16  112 | 174  174  174


         To complement the checks done by IEEETEST I wrote some short
         programs DENORMTS, RCTRL, PCTRL in Turbo Pascal 6.0 that test
         the following features:

         1. support for denormals in all precisions (single, double, extended)
         2. support for the four IEEE rounding modes (up, down, nearest, chop)
         3. support for precision control

         Note that passing all tests is required for IEEE conformance and
         required for compatibility with Intel's coprocessors. Precision
         control forces the results of the FADD, FSUB, FMUL, FDIV, and FSQRT
         instruction to be rounded to the specified precision (single, double,
         double extended). This feature is provided to obtain compatibility
         with certain programming languages [17]. By specifying lower
         precision, one effectively nullifies the advantages of extended
         precision intermediate results. The IEEE-754 standard for floating
         point arithmetic demands that processors/fp-packages that can not
         store the result of operations *directly* to single and double
         precision location must provide precision control. The programs
         that test precision control and rounding control are designed to
         return a different result for each of the modes for the same sequence
         of operation. The source code of the programs can be found in appendix
         A. The Intel 8087 and 80287 were not tested with DENORMTS since Turbo
         Pascal does not support extended precision denormals on 8087/80287
         processors, so the denormal test fails anyway. The 8087 and 287
         pass the RCTRL and PCTRL tests, though.


         These are the results for the Intel 387, Intel 387DX, Intel 486,
         Intel RapidCAD, Cyrix 83D87, Cyrix 387+, C&T 38700, and the EM87
         emulator (on a 80386 machine)

         Precision Control           SINGLE   1.13311278820037842E+0000
                                     DOUBLE   1.23456789006442125E+0000
                                     EXTENDED 1.23456789012337585E+0000

         Rounding Control            NEAREST -1.23427629010100635E+0100
                                     DOWN    -1.23427623555772409E+0100
                                     UP      -1.23457760966801097E+0100
                                     CHOP    -1.23397493540770643E+0100

         Denormal support

         SINGLE denormals supported
         SINGLE denormal prints as:    4.60943116855005E-0041
         Denormal should be printed as 4.60943...E-0041

         DOUBLE denormals supported
         DOUBLE denormal prints as:    8.75000000000016E-0311
         Denormal should be printed as 8.75...E-0311

         EXTENDED denormals supported
         EXTENDED denormal prints as:  1.31640625000000E-4934
         Denormal should be printed as 1.3164...E-4934


         These are the results for the ULSI 83C87

         Precision Control           SINGLE   1.23456789012337585E+0000
                                     DOUBLE   1.23456789012337585E+0000
                                     EXTENDED 1.23456789012337585E+0000

         Rounding Control            NEAREST -1.23427629010100635E+0100
                                     DOWN    -1.23427623555772409E+0100
                                     UP      -1.23457760966801097E+0100
                                     CHOP    -1.23397493540770643E+0100

         Denormal support

         SINGLE denormals supported
         SINGLE denormal prints as:    4.60943116855005E-0041
         Denormal should be printed as 4.60943...E-0041

         DOUBLE denormals supported
         DOUBLE denormal prints as:    8.75000000000016E-0311
         Denormal should be printed as 8.75...E-0311

         EXTENDED denormals supported
         EXTENDED denormal prints as:  1.31640625000000E-4934
         Denormal should be printed as 1.3164...E-4934


         These are the results for the IIT 3C87

         Precision Control           SINGLE   1.13311278820037842E+0000
                                     DOUBLE   1.23456789006442125E+0000
                                     EXTENDED 1.23456789012337585E+0000

         Rounding Control            NEAREST -1.23427629010100635E+0100
                                     DOWN    -1.23427623555772409E+0100
                                     UP      -1.23457760966801097E+0100
                                     CHOP    -1.23397493540770643E+0100

         Denormal support

         SINGLE denormals supported
         SINGLE denormal prints as:    4.60943116855005E-0041
         Denormal should be printed as 4.60943...E-0041

         DOUBLE denormals supported
         DOUBLE denormal prints as:    8.75000000000016E-0311
         Denormal should be printed as 8.75...E-0311

         EXTENDED denormals not supported


         These are the results for the TP 6.0 coprocessor emulator:

         Precision Control           SINGLE   1.23456789012351396E+0000
                                     DOUBLE   1.23456789012351396E+0000
                                     EXTENDED 1.23456789012351396E+0000

         Rounding Control            NEAREST -1.23457766383395931E+0100
                                     DOWN    -1.23457766383395931E+0100
                                     UP      -1.23457766383395931E+0100
                                     CHOP    -1.23457766383395931E+0100

         Denormal support

         SINGLE denormals not supported
         DOUBLE denormals not supported
         EXTENDED denormals not supported


         The test results show that the IIT 3C87 does not conform to the
         IEEE-754 floating-point standard in that it does not support
         denormals in double extended precision. The ULSI 83C87 does not
         conform to that standard in that it does not support precision
         control, but uses double extended precision for all operations.
         The TP 6.0 emulator supports neither precision control, rounding
         control nor support for any denormals. In addition, its basic
         arithmetic operations do not seem to conform to the IEEE standard
         as the results of the test programs differ from that of any result
         computed by a coprocessor for any mode.


         With regard to the accuracy of transcendental functions, Cyrix
         claims that the relative error of the transcendental functions
         on the 83D87 never exceeds 0.5 units in the last place (0.5 ULP)
         of the double extended format [13]. This means that the maximum
         relative error is below 2**-64, while Intel's published error
         limit is 2**-62. While Intel uses a modified CORDIC algorithm
         [18,19] to compute the transcendental functions, Cyrix uses
         rational approximations that utilize a very fast array multiplier.
         For an explanation why this approach is superior to CORDIC with
         today's technology, see [61]. Also, Cyrix uses an internal 75 bit
         data path for the mantissa [15], so intermediate computations in
         the generation of transcendental function values will enjoy some
         additional accuracy over the 64 bits provided by the double
         extended format. Using 75 mantissa bits also provides an advantage
         over other coprocessors like the Intel 387DX and ULSI 83C87 which
         use only a 68 bit data path for the mantissa [58,59]. Note that a
         maximum relative error of 0.5 ULP for the Cyrix coprocessor does
         not mean that it returns the 'exact' result (machine number closest
         to infinitely precise result) all the time. Just consider the case
         where the infinitely precise result of a transcendental function
         falls nearly half way between two machine numbers. A relative error
         of 0.5 ULP can cause the result to be either of the numbers after
         rounding, depending on the direction of the error. But the 83D87
         should deliver results that never differ from the 'exact' result
         by more than one ULP. Please note that the claim of relative error
         being below 0.5 ULPs is slightly exaggerated. 0.6 ULPs would be a
         more realistic error limit. Imagine that the infinitely precise
         result for some argument to a transcendental was xxx..xxx1001...
         (where the xxx...xxx represent the first 64 bits of the result),
         but that the coprocessor computes the result as xxx..xxx0111 and
         then round this down to xxx..xxx0000. Then the relative error is
         (1001b-0b)/1000b = 0.5625 ULPs. I tested some of the transcendental
         functions of the Cyrix 387+ and found the relative error to be
         always below 0.6 ULPs. Cyrix also claims that its transcendental
         functions satisfy the monotonicity criterion [13], a claim not
         made by any of the competitors, which does not mean that the
         transcendental functions on the other 387 compatibles may not be
         monotonic, too. Monotonicity means that for all x1 > x2, it always
         follows that f(x1) >= f(x2) for an increasing function like sin
         on [0..pi/4]. Likewise, for a decreasing function like cos on
         [0..pi/4], for all x1 > x2, it follows that f(x1) <= f(x2).

         The Weitek Abacus 3167 and 4167 implement only the basic arithmetic
         operations (add, subtract, negate, multiply, divide, square root)
         in hardware. Transcendental functions are provided via a software
         library provided by Weitek. For these library functions Weitek
         claims a maximum relative error of 5 ULPs [31,33] (ULP = Unit in
         the Last Place, numeric weight of the least significant mantissa
         bit). This means that the last three bits in the mantissa of a
         double precision result can be wrong. Note that the Intel 387 and
         compatible math coprocessors generate the transcendental functions
         with a small relative error with regard to the *extended double
         precision* format. Thus, when rounded to double precision, their
         function values are nearly always 'exact'. 387 type coprocessors
         have superior accuracy when compared with Weitek's coprocesssors.

         The test diskette distributed with early versions of the
         Cyrix 83D87 contained a program TRANCK that checks the
         accuracy of the transcendental functions in the coprocessor
         against a more precise software arithmetic [16]. I used this
         program to compare the accuracy of the transcendental functions
         on those 287/387/486 coprocessors/FPUs available to me. As TRANCK
         will not accept negative numbers as interval limits, I tested
         each function on an interval along the positive x-axis. The
         functions tested are F2XM1 (2**x-1), FSIN (sine), FCOS (cosine),
         FPTAN (tangent), FPATAN (arctangent), FYL2X (y * log2 (x)),
         and FYL2XP1 (y * log2 (x+1)). These are all the transcendental
         functions implemented on the 80387. Note that the square root
         (FSQRT) is *not* a transcendental function. For every function,
         100,000 arguments were evaluated. The arguments were uniformly
         distributed within the interval tested. The EM87 emulator could
         not be checked with TRANCK, since the multiple precision package
         in TRANCK would always return with an error message immediately.
         However, the Franke387 emulator could be tested.


         Test results for accuracy of transcendental functions for double
         extended precision as returned by the program TRANCK. 100,000
         trials per function.

         %wrong      is the percentage of results that differ from the 'exact'
                     result (infinitely precise result rounded to 64 bits)
         ULP_hi      is the number of results where the returned result was
                     greater than the 'exact' (correctly rounded) result by
                     one ULP (the numeric weight of the last mantissa bit,
                     2**-63 to 2**-64 depending of the size of the number).
         ULPs_hi     is the number of results where the returned result was
                     greater than the 'exact' result by two or more ULPs.
         ULP_lo      is the number of results where the returned result was
                     smaller than the 'exact' (correctly rounded) result by
                     one ULP (the numeric weight of the last mantissa bit,
                     2**-63 to 2**-64 depending of the size of the number).
         ULPs_lo     is the number of results where the returned result was
                     smaller than the 'exact' result by two or more ULPs.
         max ULP err is the maximum deviation of a returned result from the
                     'exact' answer expressed in ULPs.


         Franke387 V2.4 emulator
                                                                 max
         funct. interval   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      39.042  25301     708  13029       4       2
         COS    0,pi/4      75.714  49827   25887      0       0       3
         TAN    0,pi/4      76.976  14230   10029  24323   28394       9
         ATAN   0,1         55.826  26028    1529  24044    4225       4
         2XM1   0,0.5       96.717      0       0  47910   48807       5
         YL2XP1 0,sqrt(2)-1 93.007    578       9  27416   65004       8
         YL2X   0.1,10      62.252  16817    4712  37082    3641    2953


         Microsoft's coproc. emulator (part of MS-C and MS-Fortran libraries)
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4         N/A    N/A     N/A    N/A     N/A     N/A
         COS    0,pi/4         N/A    N/A     N/A    N/A     N/A     N/A
         TAN    0,pi/4      40.828  27764    1520  11445      99       2
         ATAN   0,1         32.307  18893     485  12530     299       2
         2XM1   0,0.5       52.163   8585     189  37745    5644       3
         YL2XP1 0,sqrt(2)-1 88.801   4714     916  14239   68932      11
         YL2X   0.1,10      36.598  13813    3272  13866    5647      11


         INTEL 8087, 80287
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4         N/A    N/A     N/A    N/A     N/A     N/A
         COS    0,pi/4         N/A    N/A     N/A    N/A     N/A     N/A
         TAN    0,pi/4      37.001  18756     524  17405     316       2
         ATAN   0,1          9.666   6065       0   3601       0       1
         2XM1   0,0.5       19.920      0       0  19920       0       1
         YL2XP1 0,sqrt(2)-1  7.780    868       0   6912       0       1
         YL2X   0.1,10       1.287    723       0    564       0       1


         INTEL 387
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      28.872   2467       0  26392      13       2
         COS    0,pi/4      27.213  27169      35      9       0       2
         TAN    0,pi/4      10.532    441       0  10091       0       1
         ATAN   0,1          7.088   2386       0   4691       1       2
         2XM1   0,0.5       32.024      0       0  32024       0       1
         YL2XP1 0,sqrt(2)-1 22.611   3461       0  19150       0       1
         YL2X   0.1,10      13.020   6508       0   6512       0       1


         INTEL 387DX
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      28.873   2467       0  26393      13       2
         COS    0,pi/4      27.121  27090      22      9       0       2
         TAN    0,pi/4      10.711    457       0  10254       0       1
         ATAN   0,1          7.088   2386       0   4691       1       2
         2XM1   0,0.5       32.024      0       0  32024       0       1
         YL2XP1 0,sqrt(2)-1 22.611   3461       0  19150       0       1
         YL2X   0.1,10      13.020   6508       0   6512       0       1


         ULSI 83C87
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      35.530   4989       6  30238     297       2
         COS    0,pi/4      43.989  11193     675  31393     728       2
         TAN    0,pi/4      48.539  18880    1015  26349    2295       3
         ATAN   0,1         20.858     62       0  20796       0       1
         2XM1   0,0.5       21.257      4       0  21253       0       1
         YL2XP1 0,sqrt(2)-1 27.893   9446       0  18213     234       2
         YL2X   0.1,10      13.603   9816       0   3787       0       1


         IIT 3C87
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      18.650  11171      0    7479       0       1
         COS    0,pi/4       7.700   3024      0    4676       0       1
         TAN    0,pi/4      20.973   9681      0   11291       1       2
         ATAN   0,1         19.280  13186      0    6094       0       1
         2XM1   0,0.5       25.660  17570      0    8090       0       1
         YL2XP1 0,sqrt(2)-1 45.830  23503   1896   19654     777       3
         YL2X   0.1,10      10.888   5638    357    4845      48       3


         C&T 38700DX
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4       1.821   1272      0     549       0       1
         COS    0,pi/4      23.358  12458      0   10901       0       1
         TAN    0,pi/4      17.178  10725      0    6453       0       1
         ATAN   0,1          9.359   7082      0    2277       0       1
         2XM1   0,0.5       15.188   3039      0   12149       0       1
         YL2XP1 0,sqrt(2)-1 19.497  12109      0    7388       0       1
         YL2X   0.1,10      46.868    261      0   46607       0       1


         CYRIX 83D87
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4       1.554   1015      0     539       0       1
         COS    0,pi/4       0.925    143      0     782       0       1
         TAN    0,pi/4       4.147    881      0    3266       0       1
         ATAN   0,1          0.656    229      0     427       0       1
         2XM1   0,0.5        2.628   1433      0    1194       0       1
         YL2XP1 0,sqrt(2)-1  3.242    825      0    2417       0       1
         YL2X   0.1,10       0.931    256      0     675       0       1


         CYRIX 387+
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4       1.486    864       0    622       0       1
         COS    0,pi/4       2.072     12       0   2060       0       1
         TAN    0,pi/4       0.602     63       0    539       0       1
         ATAN   0,1          0.384     12       0    372       0       1
         2XM1   0,0.5        1.985     27       0   1958       0       1
         YL2XP1 0,sqrt(2)-1  3.662   1705       0   1957       0       1
         YL2X   0.1,10       0.764    367       0    397       0       1


         INTEL RapidCAD, Intel 486
                                                                 max
         funct. intervall   %wrong ULP_hi ULPs_hi ULP_lo ULPs_lo ULP err

         SIN    0,pi/4      16.991   1517       0  15474       0       1
         COS    0,pi/4       9.003   7603       0   1400       0       1
         TAN    0,pi/4      10.532    441       0  10091       0       1
         ATAN   0,1          7.078   2386       0   4691       1       2
         2XM1   0,0.5       32.025      0       0  32025       0       1
         YL2XP1 0,sqrt(2)-1 21.800    533       0  21267       0       1
         YL2X   0.1,10       3.894   1879       0   2015       0       1


         The test results above indicate that all 80x87 compatibles do not
         exceed Intel's stated error bound of 3 ULPs for the transcendental
         functions. However, some coprocessors are more accurate than others.
         Rating the coprocessors according to the accuracy of their trans-
         cendental functions gives the following list (highest accuracy
         first): Cyrix 387+, Cyrix 83D87, Intel 486, Intel RapidCAD, Intel
         80287(!), C&T 38700DX, Intel 387DX, Intel 80387, IIT 3C87, ULSI 83C87.
         The tests also show that the problems with excessive inaccuracy of
         the transcendental functions in early versions of the IIT coprocessors
         with errors of up to 8 ULPs [8] have been eliminated. According to
         [56], certain problems with the FPATAN instruction on the IIT 3C87
         occurring under the UNIX version of AutoCAD have been corrected in
         June, 1990. The Franke387 has acceptable accuracy for the FSIN, FCOS,
         and FPATAN instructions, taking into consideration that according to
         its documentation, Franke387 uses only 64 bits of precision for the
         intermediate results, while coprocessors typically use 68 bits
         and more. However, the larger error in the FPTAN, F2XM1, FYL2XP1,
         and especially the FYL2X operations show that the emulator doesn't
         use state of the art algorithms, which ensure an error of only a
         very few ULPs even if no extra precise intermediate results are
         available. Microsoft's coprocessor emulator provides transcendental
         functions with rather good accuracy, except for the logarithmic
         operations, which seem to contain some minor flaws.



         Compatibility:

         Chips and Technologies has included a program SMDIAG on the diagnostic
         disk V1.0 for the SuperMATH 38700DX to test the compatibility of the
         computational results and flag settings returned by the coprocessor
         with the Intel 387DX. However, the tests for the transcendental
         functions seem to have been tweaked to let the C&T 38700DX pass, while
         coprocessors like the Intel RapidCAD and the Cyrix 83D87 fail. Also,
         SMDIAG shows failure in the FSCALE test for the Intel RapidCAD,
         Cyrix 83D87, Cyrix 387+, and ULSI 83C87, although they return the
         correct result according to Intel's documentation for the Intel
         387DX (Intel's second generation 387), which is indeed returned by
         the 387DX. SMDIAG expects the result returned by the original Intel
         80387. Please note that chip manufacturers often do quite bug fixes,
         so it wouldn't be surprising if somebody else came up with different
         results as the ones below. The Intel 387 alone seems to have been
         produced in four different versions that can be told apart by software.
         Cyrix, ULSI, and IIT have manufactured at least two versions of their
         coprocessors each. The coprocessors I tested have the following
         manufacturing dates stamped on them. Intel 387DX: 91/49, C&T 38700DX:
         92/19, Cyrix 387+: 92/11, Intel RapidCAD: 92/05, ULSI 83C87: 91/48,
         IIT 3C87: 92/20.


         Results of running the SMDIAG program on 387 compatible coprocessors
         (p = passed, f = failed)

                        Intel Intel Intel Cyrix Cyrix   IIT  ULSI   C&T
         Test        RapidCAD 387DX 80387  387+ 83D87  3C87 83C87 38700

         1  (fstore)        f     p     p     p     f     f     f     p ##,%%
         2  (fiall)         p     p     p     p     p     p     f     p
         3  (faddsub)       p     p     p     p     p     p     p     p
         4  (faddsub_nr)    p     p     p     p     f     f     f     p %%
         5  (faddsub_cp)    p     p     p     p     f     f     f     p %%
         6  (faddsub_dn)    p     p     p     p     f     f     f     p %%
         7  (faddsub_up)    p     p     p     p     f     f     f     p %%,&&
         8  (fmul)          p     p     p     p     p     f     f     p
         9  (fdivn)         p     p     p     p     p     p     p     p
         10 (fdiv)          p     p     p     p     p     p     f     p
         11 (fxch)          p     p     p     p     p     p     p     p
         12 (fyl2x)         p     p     p     f     f     f     f     p ++
         13 (fyl2xp1)       f     p     p     f     f     f     f     p ++
         14 (fsqrt)         p     p     p     p     p     p     p     p
         15 (fsincos)       f     p     p     f     f     f     f     p ++
         16 (fptan)         p     p     p     f     p     f     f     p ++
         17 (fpatan)        p     p     p     f     f     f     f     p ++
         18 (f2xm1)         p     p     p     f     f     f     f     p ++
         19 (fscale)        f     f     p     f     f     f     f     p **
         20 (fcom1)         p     p     p     p     p     f     f     p
         21 (fprem)         p     p     p     p     p     p     p     p
         22 (misc1)         p     p     p     p     p     f     f     p
         23 (misc3)         p     p     p     p     p     p     p     p
         24 (misc4)         p     p     p     p     f     f     p     p %%

         failed modules:    4     1     0     7    12    16    17     0


         ## the failure of the Intel RapidCAD is caused by the fact that
            it stores the value of BCD INDEFINITE differently from the
            Intel 387DX. It uses FFFFC000000000000000, while the 387DX uses
            FFFF8000000000000000. However, both encodings are valid according
            to Intel's documentation, which defines the BCD INDEFINITE as
            FFFFUUUUUUUUUUUUUUUU, where U is undefined. So failure of the
            RapidCAD to deliver the same answer as the 387DX is *not* an
            error, just a very slight incompatibility.
         ** the FSCALE errors reported for the Intel 387DX, Intel RapidCAD,
            Cyrix 83D87, Cyrix 387+, and ULSI 83C87 are due to a single
            'wrong' result each returned by one of the FSCALE computations.
            SMDIAG expects the result returned by the first generation
            Intel 80387 (and the C&T 38700DX). However, this result is
            wrong according to Intel's documentation and the behavior was
            corrected in the second generation Intel 387DX. Therefor, the
            Intel RapidCAD, Cyrix 83D87, Cyrix 387+, and ULSI 83C87 return
            the correct result compatible with the Intel 387DX.
         %% Failures reported for the Cyrix 83D87 are due to the fact that it
            converts pseudodenormals contained in its registers to normalized
            numbers upon storing them to memory with the FSTP TBYTE PTR
            instruction. Intel's processors store pseudodenormals without
            'normalizing' them. This is an incompatibility, but not an error,
            because both encodings evaluate to the same value should they be
            reused in a calculation.
         && Two of the failures reported for the Cyrix 83D87 are actual errors
            where the Cyrix 83D87 fails to deliver the correct result.
            1) control word = 0A7F (closure=proj., round=up, precision=53 bit)
               ST(0) = 0001 ABCEF9876542101
               ST(1) = 0001 800000000345FFF
               instruction: FSUBRP ST(1), ST
               result should be: 0000 2BCEF987650EC800, status word = 3A30
               83D87 returns:    0000 3BCEF987650EC000, status word = 3830
            2) control word = 0A7F (closure=proj., round=up, precision=53 bit)
               ST(0) = 0001 ABCEF9876542101
               ST(1) = 0001 800000000000000
               instruction: FSUB ST, ST(1)
               result should be: 0000 2BCEF98765432800, status word = 3A30
               83D87 returns:    0000 3BCEF98765432000, status word = 3830
         ++ The failures for the test of transcendental functions are caused
            by the tested coprocessor returning results that differ from the
            ones returned by the Intel 387DX. On the Cyrix 83D87, Cyrix 387+,
            and Intel RapidCAD, this is simply due to the improved accuracy
            these coprocessors provide over the Intel 387DX. The failures of
            the IIT 3C87 and ULSI 83C87 are mainly due to the lesser accuracy
            in the transcendental functions of these coprocessors, but for
            the IIT 3C87 an additional source of failures is its inability to
            handle extended precision denormals.





         References

         [1]  Schnurer, G.: Zahlenknacker im Vormarsch.
              c't 1992, Heft 4, Seiten 170-186
         [2]  Curnow, H.J.; Wichmann, B.A.: A synthetic benchmark.
              Computer Journal, Vol. 19, No. 1, 1976, pp. 43-49
         [3]  Wichmann, B.A.: Validation code for the Whetstone benchmark.
              NPL Report DITC 107/88, National Physics Laboratory, UK,
              March 1988
         [4]  Curnow, H.J.: Wither Whetstone? The Synthetic Benchmark after
              15 Years.
              In: Aad van der Steen (ed.): Evaluating Supercomputers.
              London: Chapman and Hall 1990
         [5]  Dongarra, J.J.: The Linpack Benchmark: An Explanation.
              In: Aad van der Steen (ed.): Evaluating Supercomputers.
              London: Chapman and Hall 1990
         [6]  Dongarra, J.J.: Performance of Various Computers Using Standard
              Linear Equations Software.
              Report CS-89-85, Computer Science Department, University of
              Tennessee, March 11, 1992
         [7]  Huth, N.: Dichtung und Wahrheit oder Datenblatt und Test.
              Design & Elektronik 1990, Heft 13, Seiten 105-110
         [8]  Ungerer, B.: Sockelfolger.
              c't 1990, Heft 4, Seiten 162-163
         [9]  Coonen, J.T.: Contributions to a Proposed Standard for Binary
              Floating-Point Arithmetic
              Ph.D. thesis, University of California, Berkeley, 1984
         [10] IEEE: IEEE Standard for Binary Floating-Point Arithmetic.
              SIGPLAN Notices, Vol. 22, No. 2, 1985, pp. 9-25
         [11] IEEE Standard for Binary Floating-Point Arithmetic.
              ANSI/IEEE Std 754-1985.
              New York, NY: Institute of Electrical and Electronics
              Engineers 1985
         [12] FasMath 83D87 Compatibility Report. Cyrix Corporation, Nov. 1989
              Order No. B2004
         [13] FasMath 83D87 Accuracy Report. Cyrix Corporation, July 1990
              Order No. B2002
         [14] FasMath 83D87 Benchmark Report. Cyrix Corporation, June 1990
              Order No. B2004
         [15] FasMath 83D87 User's Manual. Cyrix Corporation, June 1990
              Order No. L2001-003
         [16] Brent, R.P.: A FORTRAN multiple-precision arithmetic package.
              ACM Transactions on Mathematical Software, Vol. 4, No. 1,
              March 1978, pp. 57-70
         [17] 387DX User's Manual, Programmer's Reference. Intel Corporation,
              1989
              Order No. 231917-002
         [18] Volder, J.E.: The CORDIC Trigonometric Computing Technique.
              IRE Transactions on Electronic Computers, Vol. EC-8, No. 5,
              September 1959, pp. 330-334
         [19] Walther, J.S.: A unified algorithm for elementary functions.
              AFIPS Conference Proceedings, Vol. 38, SJCC 1971, pp. 379-385
         [20] Esser, R.; Kremer, F.; Schmidt, W.G.: Testrechnungen auf der
              IBM 3090E mit Vektoreinrichtung.
              Arbeitsbericht RRZK-8803, Regionales Rechenzentrum an der
              Universit"at zu Kln, Februar 1988
         [21] McMahon, H.H.: The Livermore Fortran Kernels: A test of the
              numerical performance range.
              Technical Report UCRL-53745, Lawrence Livermore National
              Laboratory, USA, December 1986
         [22] Nave, R.: Implementation of Transcendental Functions on a Numerics
              Processor.
              Microprocessing and Microprogramming, Vol. 11, No. 3-4,
              March-April 1983, pp. 221-225
         [23] Yuen, A.K.: Intel's Floating-Point Processors.
              Electro/88 Conference Record, Boston, MA, USA, 10-12 May 1988,
              pp. 48/5-1 - 48/5-7
         [24] Stiller, A.; Ungerer, B.: Ausgerechnet.
              c't 1990, Heft 1, Seiten 90-92
         [25] Rosch, W.L.: Handfeste Hilfe oder Seifenblase?
              PC Professionell, Juni 1991, Seiten 214-237
         [26] Intel 80286 Hardware Reference Manual. Intel Corporation, 1987
              Order No.210760-002
         [27] AMD 80C287 80-bit CMOS Numeric Processor. Advanced Micro Devices,
              June 1989
              Order No. 11671B/0
         [28] Intel RapidCAD(tm) Engineering CoProcessor Performance Brief.
              Intel Corporation, 1992
         [29] i486(tm) Microprocessor Performance Report. Intel Corporation,
              April 1990
              Order No. 240734-001
         [30] Intel486(tm) DX2 Microprocessor Performance Brief. Intel
              Corporation, March 1992
              Order No. 241254-001
         [31] Abacus 3167 Floating-Point Coprocessor Data Book. Weitek
              Corporation, July 1990
              DOC No. 9030
         [32] WTL 4167 Floating-Point Coprocessor Data Book. Weitek
              Corporation, July 1989
              DOC No. 8943
         [33] Abacus Software Designer's Guide. Weitek Corporation,
              September 1989
              DOC No. 8967
         [34] Stiller, A.: Cache & Carry.
              c't 1992, Heft 6, Seiten 118-130
         [35] Stiller, A.: Cache & Carry, Teil 2.
              c't 1992, Heft 7, Seiten 28-34
         [36] Palmer, J.F.; Morse, S.P.: Die mathematischen Grundlagen der
              Numerik-Prozessoren 8087/80287.
              Mnchen: tewi 1985
         [37] 80C187 80-bit Math Coprocessor Data Sheet. Intel Corporation,
              September 1989
              Order No. 270640-003
         [38] IIT-2C87 80-bit Numeric Co-Processor Data Sheet. IIT, May 1990
         [39] Engineering note 4x4 matrix multiply transformation. IIT, 1989
         [40] Tscheuschner, E.: 4 mal 4 auf einen Streich.
              c't 1990, Heft 3, Seiten 266-276
         [41] Goldberg, D.: Computer Arithmetic.
              In: Hennessy, J.L.; Patterson, D.A.: Computer Architecture A
              Quantitative Approach. San Mateo, CA: Morgan Kaufmann 1990
         [42] 8087 Math Coprocessor Data Sheet. Intel Corporation, October 1989,
              Order No. 205835-007
         [43] 8086/8088 User's Manual, Programmer's and Hardware Reference.
              Intel Corporation, 1989
              Order No. 240487-001
         [44] 80286 and 80287 Programmer's Reference Manual. Intel Corporation,
              1987
              Order No. 210498-005
         [45] 80287XL/XLT CHMOS III Math Coprocessor Data Sheet. Intel
              Corporation, May 1990
              Order No. 290376-001
         [46] Cyrix FasMath(tm) 82S87 Coprocessor Data Sheet. Cyrix Coporation,
              1991
              Document 94018-00 Rev. 1.0
         [47] IIT-3C87 80-bit Numeric Co-Processor Data Sheet. IIT, May 1990
         [48] 486(tm)SX(tm) Microprocessor/ 487(tm)SX(tm) Math CoProcessor
              Data Sheet. Intel Corporation, April 1991.
              Order No. 240950-001
         [49] Schnurer, G.: Die gro"se Verlade.
              c't 1991, Heft 7, Seiten 55-57
         [50] Schnurer, G.: Eine 4 f"ur alle.
              c't 1991, Heft 6, Seite 25
         [51] Intel486(tm)DX Microprocessor Data Book. Intel Corporation,
              June 1991
              Order No. 240440-004
         [52] i486(tm) Microprocessor Hardware Reference Manual. Intel
              Corporation, 1990
              Order No. 240552-001
         [53] i486(tm) Microprocessor Programmer's Reference Manual. Intel
              Corporation, 1990
              Order No. 240486-001
         [54] Ungerer, B.: Kalte H"ute.
              c't 1992, Heft 8, Seiten 140-144
         [55] Ungerer, B.: Hei"se Sache.
              c't 1991, Heft 4, Seiten 104-108
         [56] Rosch, W.L.: Handfeste Hilfe oder Seifenblase?
              PC Profesionell, Juni 1991, Seiten 214-237
         [57] Niederkr"uger, W.: Lebendige Vergangenheit.
              c't 1990, Heft 12, Seiten 114-116
         [58] ULSI Math*Co Advanced Math Coprocessor Technical Specification.
              ULSI System, 5/92, Rev. E
         [59] 387(tm)DX Math CoProcessor Data Sheet. Intel Corporation,
              September 1990.
              Order No. 240448-003
         [60] 387(tm) Numerics Coprocessor Extension Data Sheet. Intel
              Corporation, February 1989.
              Order No. 231920-005
         [61] Koren, I.; Zinaty, O.: Evaluating Elementary Functions in a
              Numerical Coprocessor Based on Rational Approximations.
              IEEE Transactions on Computers, Vol. C-39, No. 8, August 1990,
              pp. 1030-1037
         [62] 387(tm) SX Math CoProcessor Data Sheet. Intel Corporation,
              November 1989
              Order No. 240225-005
         [63] Frenkel, G.: Coprocessors Speed Numeric Operations.
              PC-Week, August 27, 1990
         [64] Schnurer, G.; Stiller, A.: Auto-Matt.
              c't 1991, Heft 10, Seiten 94-96
         [65] Grehan, R.: FPU Face-Off.
              Byte, November 1990, pp. 194-200
         [66] Tang, P.T.P.: Testing Computer Arithmetic by Elementary Number
              Theory. Preprint MCS-P84-0889, Mathematics and Computer Science
              Division, Argonne National Laboratory, August 1989
         [67] Ferguson, W.E.: Selecting math coprocessors.
              IEEE Spectrum, July 1991, pp. 38-41
         [68] Schnabel, J.: Viermal 387.
              Computer Pers"onlich 1991, Heft 22, Seiten 153-156
         [69] Hofmann, J.: Starke Rechenknechte.
              mc 1990, Heft 7, Seiten 64-67
         [70] Woerrlein, H.; Hinnenberg, R.: Die Lust an der Power.
              Computer Live 1991, Heft 10, Seiten 138-149
         [71] email from Peter Forsberg (peterf@vnet.ibm.com),
              email from Alan Brown (abrown@Reston.ICL.COM)
         [72] email from Eric Johnson (johnsone%camax01@uunet.UU.NET),
              email from Jerry Whelan (guru@stasi.bradley.edu),
              email from Arto Viitanen (av@cs.uta.fi),
              email from Richard Krehbiel (richk@grebyn.com)
         [73] email from Fred Dunlap (cyrix!volt!fred@texsun.Central.Sun.COM)
         [74] correspondence with Bengt Ask (f89ba@efd.lth.se)
         [75] email from Thomas Hoberg (tmh@prosun.first.gmd.de)
         [76] Microsoft Macro Assembler Programmer's Guide Version 6.0,
              Microsoft Corporation, 1991. Document No. LN06556-0291
         [77] FasMath EMC87 User's Manual, Rev. 2. Cyrix Corporation,
              February 1991
              Order No. 90018-00
         [78] Persson, C.: Die 32-Bit-Parade
              c't 1992, Heft 9, Seiten 150-156
         [79] email from Duncan Murdoch (dmurdoch@mast.QueensU.CA)


         Manufacturer's addresses

         Intel Corporation
         3065 Bowers Avenue
         Santa Clara, CA 95051
         USA

         IIT Integrated Information Technology, Inc.
         2540 Mission College Blvd.
         Santa Clara, CA 95054
         USA

         ULSI Systems, Inc.
         58 Daggett Drive
         San Jose, CA 95134
         USA

         Chips & Technologies, Inc.
         3050 Zanker Road
         San Jose, CA 95134
         USA

         Weitek Corporation
         1060 East Arques Avenue
         Sunnyvale, CA 94086
         USA

         AMD Advanced Microdevices, Inc.
         901 Thompson Place
         P.O.B. 3453
         Sunnyvale, CA 94088-3453
         USA

         Cyrix Corporation
         P.O.B. 850118
         Richardson, TX 75085
         USA




Newsgroups: comp.sys.ibm.pc.hardware