1. 19 5月, 2013 1 次提交
    • S
      math: fix two fma issues (only affects non-nearest rounding mode, x86) · ffd8ac2d
      Szabolcs Nagy 提交于
      1) in downward rounding fma(1,1,-1) should be -0 but it was 0 with
      gcc, the code was correct but gcc does not support FENV_ACCESS ON
      so it used common subexpression elimination where it shouldn't have.
      now volatile memory access is used as a barrier after fesetround.
      
      2) in directed rounding modes there is no double rounding issue
      so the complicated adjustments done for nearest rounding mode are
      not needed. the only exception to this rule is raising the underflow
      flag: assume "small" is an exactly representible subnormal value in
      double precision and "verysmall" is a much smaller value so that
      	(long double)(small plus verysmall) == small
      then
      	(double)(small plus verysmall)
      raises underflow because the result is an inexact subnormal, but
      	(double)(long double)(small plus verysmall)
      does not because small is not a subnormal in long double precision
      and it is exact in double precision.
      now this problem is fixed by checking inexact using fenv when the
      result is subnormal
      ffd8ac2d
  2. 13 11月, 2012 1 次提交
  3. 21 6月, 2012 1 次提交
    • N
      math: fix fma bug on x86 (found by Bruno Haible with gnulib) · e5fb6820
      nsz 提交于
      The long double adjustment was wrong:
      The usual check is
        mant_bits & 0x7ff == 0x400
      before doing a mant_bits++ or mant_bits-- adjustment since
      this is the only case when rounding an inexact ld80 into
      double can go wrong. (only in nearest rounding mode)
      
      After such a check the ++ and -- is ok (the mantissa will end
      in 0x401 or 0x3ff).
      
      fma is a bit different (we need to add 3 numbers with correct
      rounding: hi_xy + lo_xy + z so we should survive two roundings
      at different places without precision loss)
      
      The adjustment in fma only checks for zero low bits
        mant_bits & 0x3ff == 0
      this way the adjusted value is correct when rounded to
      double or *less* precision.
      (this is an important piece in the fma puzzle)
      
      Unfortunately in this case the -- is not a correct adjustment
      because mant_bits might underflow so further checks are needed
      and this was the source of the bug.
      e5fb6820
  4. 20 3月, 2012 1 次提交
    • N
      use scalbn or *2.0 instead of ldexp, fix fmal · 2786c7d2
      nsz 提交于
      Some code assumed ldexp(x, 1) is faster than 2.0*x,
      but ldexp is a wrapper around scalbn which uses
      multiplications inside, so this optimization is
      wrong.
      
      This commit also fixes fmal which accidentally
      used ldexp instead of ldexpl loosing precision.
      
      There are various additional changes from the
      work-in-progress const cleanups.
      2786c7d2
  5. 19 3月, 2012 2 次提交
  6. 17 3月, 2012 1 次提交
    • R
      make fma and lrint functions build without full fenv support · 2e77dc13
      Rich Felker 提交于
      this is necessary to support archs where fenv is incomplete or
      unavailable (presently arm). fma, fmal, and the lrint family should
      work perfectly fine with this change; fmaf is slightly broken with
      respect to rounding as it depends on non-default rounding modes to do
      its work.
      2e77dc13
  7. 13 3月, 2012 1 次提交
    • R
      first commit of the new libm! · b69f695a
      Rich Felker 提交于
      thanks to the hard work of Szabolcs Nagy (nsz), identifying the best
      (from correctness and license standpoint) implementations from freebsd
      and openbsd and cleaning them up! musl should now fully support c99
      float and long double math functions, and has near-complete complex
      math support. tgmath should also work (fully on gcc-compatible
      compilers, and mostly on any c99 compiler).
      
      based largely on commit 0376d44a890fea261506f1fc63833e7a686dca19 from
      nsz's libm git repo, with some additions (dummy versions of a few
      missing long double complex functions, etc.) by me.
      
      various cleanups still need to be made, including re-adding (if
      they're correct) some asm functions that were dropped.
      b69f695a