180 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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.
 |