1. 18 5月, 2013 1 次提交
    • S
      math: tan cleanups · 1d5ba3bb
      Szabolcs Nagy 提交于
      * use unsigned arithmetics on the representation
      * store arg reduction quotient in unsigned (so n%2 would work like n&1)
      * use different convention to pass the arg reduction bit to __tan
        (this argument used to be 1 for even and -1 for odd reduction
        which meant obscure bithacks, the new n&1 is cleaner)
      * raise inexact and underflow flags correctly for small x
        (tanl(x) may still raise spurious underflow for small but normal x)
        (this exception raising code increases codesize a bit, similar fixes
        are needed in many other places, it may worth investigating at some
        point if the inexact and underflow flags are worth raising correctly
        as this is not strictly required by the standard)
      * tanf manual reduction optimization is kept for now
      * tanl code path is cleaned up to follow similar logic to tan and tanf
      1d5ba3bb
  2. 16 5月, 2013 1 次提交
    • S
      math: use double_t for temporaries to avoid stores on i386 · e216951f
      Szabolcs Nagy 提交于
      When FLT_EVAL_METHOD!=0 (only i386 with x87 fp) the excess
      precision of an expression must be removed in an assignment.
      (gcc needs -fexcess-precision=standard or -std=c99 for this)
      
      This is done by extra load/store instructions which adds code
      bloat when lot of temporaries are used and it makes the result
      less precise in many cases.
      Using double_t and float_t avoids these issues on i386 and
      it makes no difference on other archs.
      
      For now only a few functions are modified where the excess
      precision is clearly beneficial (mostly polynomial evaluations
      with temporaries).
      
      object size differences on i386, gcc-4.8:
                   old   new
      __cosdf.o    123    95
      __cos.o      199   169
      __sindf.o    131    95
      __sin.o      225   203
      __tandf.o    207   151
      __tan.o      605   499
      erff.o      1470  1416
      erf.o       1703  1649
      j0f.o       1779  1745
      j0.o        2308  2274
      j1f.o       1602  1568
      j1.o        2286  2252
      tgamma.o    1431  1424
      math/*.o   64164 63635
      e216951f
  3. 20 3月, 2012 1 次提交
    • N
      code cleanup of named constants · 0cbb6547
      nsz 提交于
      zero, one, two, half are replaced by const literals
      The policy was to use the f suffix for float consts (1.0f),
      but don't use suffix for long double consts (these consts
      can be exactly represented as double).
      0cbb6547
  4. 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