1. 17 8月, 2020 1 次提交
  2. 12 3月, 2015 1 次提交
    • S
      math: add dummy implementations of 128 bit long double functions · f4e4632a
      Szabolcs Nagy 提交于
      This is in preparation for the aarch64 port only to have the long
      double math symbols available on ld128 platforms. The implementations
      should be fixed up later once we have proper tests for these functions.
      
      Added bigendian handling for ld128 bit manipulations too.
      f4e4632a
  3. 28 10月, 2013 1 次提交
    • S
      math: extensive log*.c cleanup · 71d23b31
      Szabolcs Nagy 提交于
      The log, log2 and log10 functions share a lot of code and to a lesser
      extent log1p too. A small part of the code was kept separately in
      __log1p.h, but since it did not capture much of the common code and
      it was inlined anyway, it did not solve the issue properly. Now the
      log functions have significant code duplication, which may be resolved
      later, until then they need to be modified together.
      
      logl, log10l, log2l, log1pl:
      * Fix the sign when the return value should be -inf.
      * Remove the volatile hack from log10l (seems unnecessary)
      
      log1p, log1pf:
      * Change the handling of small inputs: only |x|<2^-53 is special
        (then it is enough to return x with the usual subnormal handling)
        this fixes the sign of log1p(0) in downward rounding.
      * Do not handle the k==0 case specially (other than skipping the
        elaborate argument reduction)
      * Do not handle 1+x close to power-of-two specially (this code was
        used rarely, did not give much speed up and the precision wasn't
        better than the general)
      * Fix the correction term formula (c=1-(u-x) was used incorrectly
        when x<1 but (double)(x+1)==2, this was not a critical issue)
      * Use the exact same method for calculating log(1+f) as in log
        (except in log1p the c correction term is added to the result).
      
      log, logf, log10, log10f, log2, log2f:
      * Use double_t and float_t consistently.
      * Now the first part of log10 and log2 is identical to log (until the
        return statement, hopefully this makes maintainence easier).
      * Most special case formulas were removed (close to power-of-two and
        k==0 cases), they increase the code size without providing precision
        or performance benefits (and obfuscate the code).
        Only x==1 is handled specially so in downward rounding mode the
        sign of zero is correct (the general formula happens to give -0).
      * For x==0 instead of -1/0.0 or -two54/0.0, return -1/(x*x) to force
        raising the exception at runtime.
      * Arg reduction code is changed (slightly simplified)
      * The thresholds for arg reduction to [sqrt(2)/2,sqrt(2)] are now
        consistently the [0x3fe6a09e00000000,0x3ff6a09dffffffff] and the
        [0x3f3504f3,0x3fb504f2] intervals for double and float reductions
        respectively (the exact threshold values are not critical)
      * Remove the obsolete comment for the FLT_EVAL_METHOD!=0 case in log2f
        (The same code is used for all eval methods now, on i386 slightly
        simpler code could be used, but we have asm there anyway)
      
      all:
      * Fix signed int arithmetics (using unsigned for bitmanipulation)
      * Fix various comments
      71d23b31
  4. 13 11月, 2012 2 次提交
  5. 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
  6. 18 3月, 2012 1 次提交
  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