123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- Lest this program stop prematurely, i.e. before displaying
- `END OF TEST',
- try to persuade the computer NOT to terminate execution when an
- error like Over/Underflow or Division by Zero occurs, but rather
- to persevere with a surrogate value after, perhaps, displaying some
- warning. If persuasion avails naught, don't despair but run this
- program anyway to see how many milestones it passes, and then
- amend it to make further progress.
- Answer questions with Y, y, N or n (unless otherwise indicated).
- Diagnosis resumes after milestone Number 0 Page: 1
- Users are invited to help debug and augment this program so it will
- cope with unanticipated and newly uncovered arithmetic pathologies.
- Please send suggestions and interesting results to
- Richard Karpinski
- Computer Center U-76
- University of California
- San Francisco, CA 94143-0704, USA
- In doing so, please include the following information:
- Precision: double;
- Version: 10 February 1989;
- Computer:
- Compiler:
- Optimization level:
- Other relevant compiler options:
- Diagnosis resumes after milestone Number 1 Page: 2
- Running this program should reveal these characteristics:
- Radix = 1, 2, 4, 8, 10, 16, 100, 256 ...
- Precision = number of significant digits carried.
- U2 = Radix/Radix^Precision = One Ulp
- (OneUlpnit in the Last Place) of 1.000xxx .
- U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 .
- Adequacy of guard digits for Mult., Div. and Subt.
- Whether arithmetic is chopped, correctly rounded, or something else
- for Mult., Div., Add/Subt. and Sqrt.
- Whether a Sticky Bit used correctly for rounding.
- UnderflowThreshold = an underflow threshold.
- E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy.
- V = an overflow threshold, roughly.
- V0 tells, roughly, whether Infinity is represented.
- Comparisions are checked for consistency with subtraction
- and for contamination with pseudo-zeros.
- Sqrt is tested. Y^X is not tested.
- Extra-precise subexpressions are revealed but NOT YET tested.
- Decimal-Binary conversion is NOT YET tested for accuracy.
- Diagnosis resumes after milestone Number 2 Page: 3
- The program attempts to discriminate among
- FLAWs, like lack of a sticky bit,
- Serious DEFECTs, like lack of a guard digit, and
- FAILUREs, like 2+2 == 5 .
- Failures may confound subsequent diagnoses.
- The diagnostic capabilities of this program go beyond an earlier
- program called `MACHAR', which can be found at the end of the
- book `Software Manual for the Elementary Functions' (1980) by
- W. J. Cody and W. Waite. Although both programs try to discover
- the Radix, Precision and range (over/underflow thresholds)
- of the arithmetic, this program tries to cope with a wider variety
- of pathologies, and to say how well the arithmetic is implemented.
- The program is based upon a conventional radix representation for
- floating-point numbers, but also allows logarithmic encoding
- as used by certain early WANG machines.
- BASIC version of this program (C) 1983 by Prof. W. M. Kahan;
- see source comments for more history.
- Diagnosis resumes after milestone Number 3 Page: 4
- Program is now RUNNING tests on small integers:
- -1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.
- Searching for Radix and Precision.
- Radix = 2.000000 .
- Closest relative separation found is U1 = 1.1102230e-16 .
- Recalculating radix and precision
- confirms closest relative separation U1 .
- Radix confirmed.
- The number of significant digits of the Radix is 53.000000 .
- Diagnosis resumes after milestone Number 30 Page: 5
- Subtraction appears to be normalized, as it should be.
- Checking for guard digit in *, /, and -.
- *, /, and - appear to have guard digits, as they should.
- Diagnosis resumes after milestone Number 40 Page: 6
- Checking rounding on multiply, divide and add/subtract.
- Multiplication appears to round correctly.
- Division appears to round correctly.
- Addition/Subtraction appears to round correctly.
- Checking for sticky bit.
- Sticky bit apparently used correctly.
- Does Multiplication commute? Testing on 20 random pairs.
- No failures found in 20 integer pairs.
- Running test of square root(x).
- Testing if sqrt(X * X) == X for 20 Integers X.
- Test for sqrt monotonicity.
- sqrt has passed a test for Monotonicity.
- Testing whether sqrt is rounded or chopped.
- Square root appears to be correctly rounded.
- Diagnosis resumes after milestone Number 90 Page: 7
- Testing powers Z^i for small Integers Z and i.
- ... no discrepancis found.
- Seeking Underflow thresholds UfThold and E0.
- Smallest strictly positive number found is E0 = 4.94066e-324 .
- Since comparison denies Z = 0, evaluating (Z + Z) / Z should be safe.
- What the machine gets for (Z + Z) / Z is 2.00000000000000000e+00 .
- This is O.K., provided Over/Underflow has NOT just been signaled.
- Underflow is gradual; it incurs Absolute Error =
- (roundoff in UfThold) < E0.
- The Underflow threshold is 2.22507385850720188e-308, below which
- calculation may suffer larger Relative error than merely roundoff.
- Since underflow occurs below the threshold
- UfThold = (2.00000000000000000e+00) ^ (-1.02200000000000000e+03)
- only underflow should afflict the expression
- (2.00000000000000000e+00) ^ (-1.02200000000000000e+03);
- actually calculating yields: 0.00000000000000000e+00 .
- This computed value is O.K.
- Testing X^((X + 1) / (X - 1)) vs. exp(2) = 7.38905609893065218e+00 as X -> 1.
- Accuracy seems adequate.
- Testing powers Z^Q at four nearly extreme values.
- ... no discrepancies found.
- Diagnosis resumes after milestone Number 160 Page: 8
- Searching for Overflow threshold:
- This may generate an error.
- Can `Z = -Y' overflow?
- Trying it on Y = -Infinity .
- Seems O.K.
- Overflow threshold is V = 1.79769313486231571e+308 .
- Overflow saturates at V0 = Infinity .
- No Overflow should be signaled for V * 1 = 1.79769313486231571e+308
- nor for V / 1 = 1.79769313486231571e+308 .
- Any overflow signal separating this * from the one
- above is a DEFECT.
- Diagnosis resumes after milestone Number 190 Page: 9
- What message and/or values does Division by Zero produce?
- Trying to compute 1 / 0 produces ... Infinity .
- Trying to compute 0 / 0 produces ... NaN .
- Diagnosis resumes after milestone Number 220 Page: 10
- No failures, defects nor flaws have been discovered.
- Rounding appears to conform to the proposed IEEE standard P754.
- The arithmetic diagnosed appears to be Excellent!
- END OF TEST.
|