| 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-016 . |
| |
| 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+000 . |
| 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.22507385850720190e-308, below which |
| calculation may suffer larger Relative error than merely roundoff. |
| Since underflow occurs below the threshold |
| UfThold = (2.00000000000000000e+000) ^ (-1.02200000000000000e+003) |
| only underflow should afflict the expression |
| (2.00000000000000000e+000) ^ (-1.02200000000000000e+003); |
| actually calculating yields: 0.00000000000000000e+000 . |
| This computed value is O.K. |
| |
| Testing X^((X + 1) / (X - 1)) vs. exp(2) = 7.38905609893065220e+000 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 = -1.#INF0000000000000e+000 . |
| Seems O.K. |
| Overflow threshold is V = 1.79769313486231570e+308 . |
| Overflow saturates at V0 = 1.#INF0000000000000e+000 . |
| No Overflow should be signaled for V * 1 = 1.79769313486231570e+308 |
| nor for V / 1 = 1.79769313486231570e+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 ... 1.#INF000e+000 . |
| |
| Trying to compute 0 / 0 produces ... -1.#IND000e+000 . |
| |
| 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, |
| except for possibly Double Rounding during Gradual Underflow. |
| The arithmetic diagnosed appears to be Excellent! |
| END OF TEST. |