cvs commit: src/lib/msun/src e_remainder.c e_remainderf.c

Bruce Evans bde at FreeBSD.org
Tue Feb 12 09:11:37 PST 2008


bde         2008-02-12 17:11:36 UTC

  FreeBSD src repository

  Modified files:
    lib/msun/src         e_remainder.c e_remainderf.c 
  Log:
  Fix remainder() and remainderf() in round-towards-minus-infinity mode
  when the result is +-0.  IEEE754 requires (in all rounding modes) that
  if the result is +-0 then its sign is the same as that of the first
  arg, but in round-towards-minus-infinity mode an uncorrected implementation
  detail always reversed the sign.  (The detail is that x-x with x's
  sign positive gives -0 in this mode only, but the algorithm assumed
  that x-x always has positive sign for such x.)
  
  remquo() and remquof() seem to need the same fix, but I cannot test them
  yet.
  
  Use long doubles when mixing NaN args.  This trick improves consistency
  of results on at least amd64, so that more serious problems like the
  above aren't hidden in simple regression tests by noise for the NaNs.
  On amd64, hardware remainder should be used since it is about 10 times
  faster than software remainder and is already used for remquo(), but
  it involves using the i387 even for floats and doubles, and the i387
  does NaN mixing which is better than but inconsistent with SSE NaN mixing.
  Software remainder() would probably have been inconsistent with
  software remainderl() for the same reason if the latter existed.
  
  Signaling NaNs cause further inconsistencies on at least ia64 and i386.
  
  Use __FBSDID().
  
  Revision  Changes    Path
  1.11      +4 -4      src/lib/msun/src/e_remainder.c
  1.8       +4 -4      src/lib/msun/src/e_remainderf.c


More information about the cvs-src mailing list