| 1 |
4 |
hellwig |
Lest this program stop prematurely, i.e. before displaying
|
| 2 |
|
|
|
| 3 |
|
|
`END OF TEST',
|
| 4 |
|
|
|
| 5 |
|
|
try to persuade the computer NOT to terminate execution when an
|
| 6 |
|
|
error like Over/Underflow or Division by Zero occurs, but rather
|
| 7 |
|
|
to persevere with a surrogate value after, perhaps, displaying some
|
| 8 |
|
|
warning. If persuasion avails naught, don't despair but run this
|
| 9 |
|
|
program anyway to see how many milestones it passes, and then
|
| 10 |
|
|
amend it to make further progress.
|
| 11 |
|
|
|
| 12 |
|
|
Answer questions with Y, y, N or n (unless otherwise indicated).
|
| 13 |
|
|
|
| 14 |
|
|
|
| 15 |
|
|
Diagnosis resumes after milestone Number 0 Page: 1
|
| 16 |
|
|
|
| 17 |
|
|
Users are invited to help debug and augment this program so it will
|
| 18 |
|
|
cope with unanticipated and newly uncovered arithmetic pathologies.
|
| 19 |
|
|
|
| 20 |
|
|
Please send suggestions and interesting results to
|
| 21 |
|
|
Richard Karpinski
|
| 22 |
|
|
Computer Center U-76
|
| 23 |
|
|
University of California
|
| 24 |
|
|
San Francisco, CA 94143-0704, USA
|
| 25 |
|
|
|
| 26 |
|
|
In doing so, please include the following information:
|
| 27 |
|
|
Precision: double;
|
| 28 |
|
|
Version: 10 February 1989;
|
| 29 |
|
|
Computer:
|
| 30 |
|
|
|
| 31 |
|
|
Compiler:
|
| 32 |
|
|
|
| 33 |
|
|
Optimization level:
|
| 34 |
|
|
|
| 35 |
|
|
Other relevant compiler options:
|
| 36 |
|
|
|
| 37 |
|
|
Diagnosis resumes after milestone Number 1 Page: 2
|
| 38 |
|
|
|
| 39 |
|
|
Running this program should reveal these characteristics:
|
| 40 |
|
|
Radix = 1, 2, 4, 8, 10, 16, 100, 256 ...
|
| 41 |
|
|
Precision = number of significant digits carried.
|
| 42 |
|
|
U2 = Radix/Radix^Precision = One Ulp
|
| 43 |
|
|
(OneUlpnit in the Last Place) of 1.000xxx .
|
| 44 |
|
|
U1 = 1/Radix^Precision = One Ulp of numbers a little less than 1.0 .
|
| 45 |
|
|
Adequacy of guard digits for Mult., Div. and Subt.
|
| 46 |
|
|
Whether arithmetic is chopped, correctly rounded, or something else
|
| 47 |
|
|
for Mult., Div., Add/Subt. and Sqrt.
|
| 48 |
|
|
Whether a Sticky Bit used correctly for rounding.
|
| 49 |
|
|
UnderflowThreshold = an underflow threshold.
|
| 50 |
|
|
E0 and PseudoZero tell whether underflow is abrupt, gradual, or fuzzy.
|
| 51 |
|
|
V = an overflow threshold, roughly.
|
| 52 |
|
|
V0 tells, roughly, whether Infinity is represented.
|
| 53 |
|
|
Comparisions are checked for consistency with subtraction
|
| 54 |
|
|
and for contamination with pseudo-zeros.
|
| 55 |
|
|
Sqrt is tested. Y^X is not tested.
|
| 56 |
|
|
Extra-precise subexpressions are revealed but NOT YET tested.
|
| 57 |
|
|
Decimal-Binary conversion is NOT YET tested for accuracy.
|
| 58 |
|
|
|
| 59 |
|
|
Diagnosis resumes after milestone Number 2 Page: 3
|
| 60 |
|
|
|
| 61 |
|
|
The program attempts to discriminate among
|
| 62 |
|
|
FLAWs, like lack of a sticky bit,
|
| 63 |
|
|
Serious DEFECTs, like lack of a guard digit, and
|
| 64 |
|
|
FAILUREs, like 2+2 == 5 .
|
| 65 |
|
|
Failures may confound subsequent diagnoses.
|
| 66 |
|
|
|
| 67 |
|
|
The diagnostic capabilities of this program go beyond an earlier
|
| 68 |
|
|
program called `MACHAR', which can be found at the end of the
|
| 69 |
|
|
book `Software Manual for the Elementary Functions' (1980) by
|
| 70 |
|
|
W. J. Cody and W. Waite. Although both programs try to discover
|
| 71 |
|
|
the Radix, Precision and range (over/underflow thresholds)
|
| 72 |
|
|
of the arithmetic, this program tries to cope with a wider variety
|
| 73 |
|
|
of pathologies, and to say how well the arithmetic is implemented.
|
| 74 |
|
|
|
| 75 |
|
|
The program is based upon a conventional radix representation for
|
| 76 |
|
|
floating-point numbers, but also allows logarithmic encoding
|
| 77 |
|
|
as used by certain early WANG machines.
|
| 78 |
|
|
|
| 79 |
|
|
BASIC version of this program (C) 1983 by Prof. W. M. Kahan;
|
| 80 |
|
|
see source comments for more history.
|
| 81 |
|
|
|
| 82 |
|
|
Diagnosis resumes after milestone Number 3 Page: 4
|
| 83 |
|
|
|
| 84 |
|
|
Program is now RUNNING tests on small integers:
|
| 85 |
|
|
-1, 0, 1/2, 1, 2, 3, 4, 5, 9, 27, 32 & 240 are O.K.
|
| 86 |
|
|
|
| 87 |
|
|
Searching for Radix and Precision.
|
| 88 |
|
|
Radix = 2.000000 .
|
| 89 |
|
|
Closest relative separation found is U1 = 1.1102230e-16 .
|
| 90 |
|
|
|
| 91 |
|
|
Recalculating radix and precision
|
| 92 |
|
|
confirms closest relative separation U1 .
|
| 93 |
|
|
Radix confirmed.
|
| 94 |
|
|
The number of significant digits of the Radix is 53.000000 .
|
| 95 |
|
|
|
| 96 |
|
|
Diagnosis resumes after milestone Number 30 Page: 5
|
| 97 |
|
|
|
| 98 |
|
|
Subtraction appears to be normalized, as it should be.
|
| 99 |
|
|
Checking for guard digit in *, /, and -.
|
| 100 |
|
|
*, /, and - appear to have guard digits, as they should.
|
| 101 |
|
|
|
| 102 |
|
|
Diagnosis resumes after milestone Number 40 Page: 6
|
| 103 |
|
|
|
| 104 |
|
|
Checking rounding on multiply, divide and add/subtract.
|
| 105 |
|
|
Multiplication appears to round correctly.
|
| 106 |
|
|
Division appears to round correctly.
|
| 107 |
|
|
Addition/Subtraction appears to round correctly.
|
| 108 |
|
|
Checking for sticky bit.
|
| 109 |
|
|
Sticky bit apparently used correctly.
|
| 110 |
|
|
|
| 111 |
|
|
Does Multiplication commute? Testing on 20 random pairs.
|
| 112 |
|
|
No failures found in 20 integer pairs.
|
| 113 |
|
|
|
| 114 |
|
|
Running test of square root(x).
|
| 115 |
|
|
Testing if sqrt(X * X) == X for 20 Integers X.
|
| 116 |
|
|
Test for sqrt monotonicity.
|
| 117 |
|
|
sqrt has passed a test for Monotonicity.
|
| 118 |
|
|
Testing whether sqrt is rounded or chopped.
|
| 119 |
|
|
Square root appears to be correctly rounded.
|
| 120 |
|
|
|
| 121 |
|
|
Diagnosis resumes after milestone Number 90 Page: 7
|
| 122 |
|
|
|
| 123 |
|
|
Testing powers Z^i for small Integers Z and i.
|
| 124 |
|
|
... no discrepancis found.
|
| 125 |
|
|
|
| 126 |
|
|
Seeking Underflow thresholds UfThold and E0.
|
| 127 |
|
|
Smallest strictly positive number found is E0 = 2.22507e-308 .
|
| 128 |
|
|
Since comparison denies Z = 0, evaluating (Z + Z) / Z should be safe.
|
| 129 |
|
|
What the machine gets for (Z + Z) / Z is 2.00000000000000000e+00 .
|
| 130 |
|
|
This is O.K., provided Over/Underflow has NOT just been signaled.
|
| 131 |
|
|
|
| 132 |
|
|
Diagnosis resumes after milestone Number 120 Page: 8
|
| 133 |
|
|
|
| 134 |
|
|
|
| 135 |
|
|
FLAW: X = 3.05947655544740190e-308
|
| 136 |
|
|
is not equal to Z = 2.22507385850720140e-308 .
|
| 137 |
|
|
yet X - Z yields 0.00000000000000000e+00 .
|
| 138 |
|
|
Should this NOT signal Underflow, this is a SERIOUS DEFECT
|
| 139 |
|
|
that causes confusion when innocent statements like
|
| 140 |
|
|
if (X == Z) ... else ... (f(X) - f(Z)) / (X - Z) ...
|
| 141 |
|
|
encounter Division by Zero although actually
|
| 142 |
|
|
X / Z = 1 + 0.375 .
|
| 143 |
|
|
The Underflow threshold is 2.22507385850720140e-308, below which
|
| 144 |
|
|
calculation may suffer larger Relative error than merely roundoff.
|
| 145 |
|
|
Since underflow occurs below the threshold
|
| 146 |
|
|
UfThold = (2.00000000000000000e+00) ^ (-1.02200000000000000e+03)
|
| 147 |
|
|
only underflow should afflict the expression
|
| 148 |
|
|
(2.00000000000000000e+00) ^ (-1.02200000000000000e+03);
|
| 149 |
|
|
actually calculating yields: 0.00000000000000000e+00 .
|
| 150 |
|
|
This computed value is O.K.
|
| 151 |
|
|
|
| 152 |
|
|
Testing X^((X + 1) / (X - 1)) vs. exp(2) = 7.38905609893065220e+00 as X -> 1.
|
| 153 |
|
|
Accuracy seems adequate.
|
| 154 |
|
|
Testing powers Z^Q at four nearly extreme values.
|
| 155 |
|
|
... no discrepancies found.
|
| 156 |
|
|
|
| 157 |
|
|
|
| 158 |
|
|
Diagnosis resumes after milestone Number 160 Page: 9
|
| 159 |
|
|
|
| 160 |
|
|
Searching for Overflow threshold:
|
| 161 |
|
|
This may generate an error.
|
| 162 |
|
|
|
| 163 |
|
|
* * * FLOATING-POINT ERROR * * *
|
| 164 |
|
|
Can `Z = -Y' overflow?
|
| 165 |
|
|
Trying it on Y = -8.98846567431157950e+307 .
|
| 166 |
|
|
Seems O.K.
|
| 167 |
|
|
Overflow threshold is V = 1.79769313486231570e+308 .
|
| 168 |
|
|
There is no saturation value because the system traps on overflow.
|
| 169 |
|
|
No Overflow should be signaled for V * 1 = 1.79769313486231570e+308
|
| 170 |
|
|
nor for V / 1 = 1.79769313486231570e+308 .
|
| 171 |
|
|
Any overflow signal separating this * from the one
|
| 172 |
|
|
above is a DEFECT.
|
| 173 |
|
|
|
| 174 |
|
|
|
| 175 |
|
|
Diagnosis resumes after milestone Number 190 Page: 10
|
| 176 |
|
|
|
| 177 |
|
|
|
| 178 |
|
|
What message and/or values does Division by Zero produce?
|
| 179 |
|
|
Trying to compute 1 / 0 produces ...
|
| 180 |
|
|
* * * FLOATING-POINT ERROR * * *
|
| 181 |
|
|
|
| 182 |
|
|
Trying to compute 0 / 0 produces ...
|
| 183 |
|
|
* * * FLOATING-POINT ERROR * * *
|
| 184 |
|
|
|
| 185 |
|
|
Diagnosis resumes after milestone Number 220 Page: 11
|
| 186 |
|
|
|
| 187 |
|
|
|
| 188 |
|
|
|
| 189 |
|
|
No failures, defects nor flaws have been discovered.
|
| 190 |
|
|
Rounding appears to conform to the proposed IEEE standard P754,
|
| 191 |
|
|
except for possibly Double Rounding during Gradual Underflow.
|
| 192 |
|
|
The arithmetic diagnosed appears to be Excellent!
|
| 193 |
|
|
|
| 194 |
|
|
A total of 3 floating point exceptions were registered.
|
| 195 |
|
|
END OF TEST.
|