cvs commit: src/lib/msun/src e_hypot.c e_hypotf.c

Bruce Evans bde at FreeBSD.org
Thu Feb 14 05:44:06 PST 2008


bde         2008-02-14 13:44:03 UTC

  FreeBSD src repository

  Modified files:
    lib/msun/src         e_hypot.c e_hypotf.c 
  Log:
  Use the expression fabs(x+0.0)+fabs(y+0.0) instad of a+b (where a is
  |x| or |y| and b is |y| or |x|) when mixing NaN arg(s).
  
  hypot*() had its own foot shooting for mixing NaNs -- it swaps the
  args so that |x| in bits is largest, but does this before quieting
  signaling NaNs, so on amd64 (where the result of adding NaNs depends
  on the order) it gets inconsistent results if setting the quiet bit
  makes a difference, just like a similar ia64 and i387 hardware comparison.
  The usual fix (see e_powf.c 1.13 for more details) of mixing using
  (a+0.0)+-(b+0.0) doesn't work on amd64 if the args are swapped (since
  the rder makes a difference with SSE). Fortunately, the original args
  are unchanged and don't need to be swapped when we let the hardware
  decide the mixing after quieting them, but we need to take their
  absolute value.
  
  hypotf() doesn't seem to have any real bugs masked by this non-bug.
  On amd64, its maximum error in 2^32 trials on amd64 is now 0.8422 ulps,
  and on i386 the maximum error is unchanged and about the same, except
  with certain CFLAGS it magically drops to 0.5 (perfect rounding).
  
  Convert to __FBSDID().
  
  Revision  Changes    Path
  1.10      +4 -4      src/lib/msun/src/e_hypot.c
  1.10      +4 -4      src/lib/msun/src/e_hypotf.c


More information about the cvs-src mailing list