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

Bruce Evans bde at FreeBSD.org
Tue Jun 1 12:03:32 PDT 2004


bde         2004/06/01 12:03:31 PDT

  FreeBSD src repository

  Modified files:
    lib/msun/src         e_powf.c 
  Log:
  Fixed another precision bug in powf().  This one is in the computation
  [t=p_l+p_h High].  We multiply t by lg2_h, and want the result to be
  exact.  For the bogus float case of the high-low decomposition trick,
  we normally discard the lowest 12 bits of the fraction for the high
  part, keeping 12 bits of precision.  That was used for t here, but it
  doesnt't work because for some reason we only discard the lowest 9
  bits in the fraction for lg2_h.  Discard another 3 bits of the fraction
  for t to compensate.
  
  This bug gave wrong results like:
  
        powf(0.9999999, -2.9999995) = 1.0000002 (should be 1.0000001)
          hex values: 3F7FFFFF C03FFFFE 3F800002 3F800001
  
  As explained in the log for the previous commit, the bug is normally
  masked by doing float calculations in extra precision on i386's, but
  is easily detected by ucbtest on systems that don't have accidental
  extra precision.
  
  This completes fixing all the bugs in powf() that were routinely found
  by ucbtest.
  
  Revision  Changes    Path
  1.11      +1 -1      src/lib/msun/src/e_powf.c


More information about the cvs-src mailing list