Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Jun 2004 11:08:39 -0700 (PDT)
From:      Bruce Evans <bde@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/lib/msun/src e_powf.c
Message-ID:  <200406011808.i51I8dCA053190@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
bde         2004/06/01 11:08:39 PDT

  FreeBSD src repository

  Modified files:
    lib/msun/src         e_powf.c 
  Log:
  Fixed 2 bugs in the computation /* t_h=ax+bp[k] High */.
  (1) The bit for the 1.0 part of bp[k] was right shifted by 4.  This seems
      to have been caused by a typo in converting e_pow.c to e_powf.c.
  (2) The lower 12 bits of ax+bp[k] were not discarded, so t_h was actually
      plain ax+bp[k].  This seems to have been caused by a logic error in
      the conversion.
  
  These bugs gave wrong results like:
  
      powf(-1.1, 101.0) = -15158.703 (should be -15158.707)
        hex values: BF8CCCCD 42CA0000 C66CDAD0 C66CDAD4
  
  Fixing (1) gives a result wrong in the opposite direction (hex C66CDAD8),
  and fixing (2) gives the correct result.
  
  ucbtest has been reporting this particular wrong result on i386 systems
  with unpatched libraries for 9 years.  I finally figured out the extent
  of the bugs.  On i386's they are normally hidden by extra precision.
  We use the trick of representing floats as a sum of 2 floats (one much
  smaller) to get extra precision in intermediate calculations without
  explicitly using more than float precision.  This trick is just a
  pessimization when extra precision is available naturally (as it always
  is when dealing with IEEE single precision, so the float precision part
  of the library is mostly misimplemented).  (1) and (2) break the trick
  in different ways, except on i386's it turns out that the intermediate
  calculations are done in enough precision to mask both the bugs and
  the limited precision of the float variables (as far as ucbtest can
  check).
  
  ucbtest detects the bugs because it forces float precision, but this
  is not a normal mode of operation so the bug normally has little effect
  on i386's.
  
  On systems that do float arithmetic in float precision, e.g., amd64's,
  there is no accidental extra precision and the bugs just give wrong
  results.
  
  Revision  Changes    Path
  1.10      +2 -1      src/lib/msun/src/e_powf.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200406011808.i51I8dCA053190>