cvs commit: src/lib/msun/src e_lgammaf_r.c

Bruce Evans bde at zeta.org.au
Fri Dec 9 23:18:19 PST 2005


On Thu, 8 Dec 2005, Mike Silbersack wrote:

> On Thu, 8 Dec 2005, Bruce Evans wrote:
>
>> Whoever makes the changes would write the regression tests :-).  Mine
>> are't sufficently general to commit.  In batch mode which takes about
>> 10 hours on a 2GHz Athlon to check all cases for floats, they are
>> currently reporting the following errors on amd64:
>
> The regression tests don't need to be exhaustive, you could just pick a few 
> values throughout the range of each function you test, and make a regression 
> test like:
>
> x = 3/2;
> if (x != 1.5)
> 	printf("FP regression!\n");
>
> Heck, you could throw all the calculations into one file.

That wouldn't be very good.

My local tests are:
- ucbtest.  Normally I run it using -DNTESTS=1000000 -DNREGIONS=64.  This
   tests a million cases of some functions (not the more exotic ones like
   gamma or the more standard ones like sqrt()).  I used to think that it
   found most problems; now I'm not so sure.  It somehow only reports
   errors of 2.9 ulps for hardware i387 cos() where my own tests easily
   find errors of several gulps (giga-ulps) in hardware cos() as a side
   effect of testing just 65536 cases for fdlibm cosf().  The difference
   may be that ucbtest mainly tests small args by my test tests mainly
   large args where hardware i387 trig is known to be very bad.  But ucbtest
   somehow doesn't report problems for cos() near pi/2 for its test of
   cos(), although it must know that there are problems since it correctly
   determines the (in)accuracy of the i387's internal pi using another
   test.  (The internal pi has only 66 digits, so cos(M_PI_2) can have
   only ~66-53 = 13 binary digits of precision, with 40 binary digits wrong,
   and in fact the magic 66 can easily be guessed by looking at the wrong
   digits in cos(M_PI_2) -- the lower 40 digits are all 0.)
- exhaustive testing of float functions relative to double functions.  Now
   has a batch mode and many parameters to change.  One parameter is the
   "stride" -- float args in bits are stepped through using step "stride",
   so stride = 1 gives exhaustive testing and stride = 0x10000 gives very
   fast non-exhaustive testing.
- non-exhaustive testing with stride = any for double complex and float
   complex functions relative to alternative implementations of the same
   function.  stride = 1 would give exhaustive testing but would take too
   long to run (~100000 years for float complex and 2**62 times longer
   than that for double complex).  Must be edited to change parameters.
- hacked versions of previous to reduce to non-complex functions.
- some performance tests.  The best one uses uniform distribution with
   a parametrized number of regions.  It also has some hacks for random
   distribution (this shows that branch misprediction slows down things
   as expected.  Hopefully most data isn't random, so branch misprediction
   is rare).
- missing: uniform and random distributions generally.  Special values.
   All needed for non-float cases.

ucbtest and my tests show:
- how hard it is to find all broken cases without using exhaustive testing.
   It's larger than any regression tests that I want to write.
- that regressions found by existing regression tests don't get fixed for
   12+ years.
- that it's useful to write independent tests.   They find independent bugs.

Bruce


More information about the cvs-src mailing list