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

Bruce Evans bde at FreeBSD.org
Wed Jun 2 10:09:06 PDT 2004


bde         2004/06/02 10:09:05 PDT

  FreeBSD src repository

  Modified files:
    lib/msun/src         e_atan2f.c 
  Log:
  Fixed lots of 1 ULP errors caused by a broken approximation for pi/2.
  We approximate pi with more than float precision using pi_hi+pi_lo in
  the usual way (pi_hi is actually spelled pi in the source code), and
  expect (float)0.5*pi_lo to give the low part of the corresponding
  approximation for pi/2.  However, the high part for pi/2 (pi_o_2) is
  rounded to nearest, which happens to round up, while the high part for
  pi was rounded down.  Thus pi_o_2+(float)0.5*pi (in infinite precision)
  was a very bad approximation for pi/2 -- the low term has the wrong
  sign and increases the error drom less than half an ULP to a full ULP.
  
  This fix rounds up instead of down for pi_hi.  Consistently rounding
  down instead of up should work, and is the method used in e_acosf.c
  and e_asinf.c.  The reason for the difference is that we sometimes
  want to return precisely pi/2 in e_atan2f.c, so it is convenient to
  have a correctly rounded (to nearest) value for pi/2 in a variable.
  a_acosf.c and e_asinf.c also differ in directly approximating pi/2
  instead pi; they multiply by 2.0 instead of dividing by 0.5 to convert
  the approximation.
  
  These complications are not directly visible in the double precision
  versions because rounding to nearest happens to round down.
  
  Revision  Changes    Path
  1.7       +2 -2      src/lib/msun/src/e_atan2f.c


More information about the cvs-all mailing list