musl/src/math/exp.c, branch master musl - an implementation of the standard library for Linux-based systems math: new exp and exp2 2019年04月18日T03:45:25+00:00 Szabolcs Nagy nsz@port70.net 2018年11月30日T21:39:47+00:00 e16f7b3c02e17d0ace779a11f0d53a9c05fdd434 from https://github.com/ARM-software/optimized-routines, commit 04884bd04eac4b251da4026900010ea7d8850edc TOINT_INTRINSICS and EXP_USE_TOINT_NARROW cases are unused. The underflow exception is signaled if the result is in the subnormal range even if the result is exact (e.g. exp2(-1023.0)). code size change: -1672 bytes. benchmark on x86_64 before, after, speedup: -Os: exp rthruput: 12.73 ns/call 6.68 ns/call 1.91x exp latency: 45.78 ns/call 21.79 ns/call 2.1x exp2 rthruput: 6.35 ns/call 5.26 ns/call 1.21x exp2 latency: 26.00 ns/call 16.58 ns/call 1.57x -O3: exp rthruput: 12.75 ns/call 6.73 ns/call 1.89x exp latency: 45.91 ns/call 21.80 ns/call 2.11x exp2 rthruput: 6.47 ns/call 5.40 ns/call 1.2x exp2 latency: 26.03 ns/call 16.54 ns/call 1.57x
from https://github.com/ARM-software/optimized-routines,
commit 04884bd04eac4b251da4026900010ea7d8850edc
TOINT_INTRINSICS and EXP_USE_TOINT_NARROW cases are unused.
The underflow exception is signaled if the result is in the subnormal
range even if the result is exact (e.g. exp2(-1023.0)).
code size change: -1672 bytes.
benchmark on x86_64 before, after, speedup:
-Os:
 exp rthruput: 12.73 ns/call 6.68 ns/call 1.91x
 exp latency: 45.78 ns/call 21.79 ns/call 2.1x
 exp2 rthruput: 6.35 ns/call 5.26 ns/call 1.21x
 exp2 latency: 26.00 ns/call 16.58 ns/call 1.57x
-O3:
 exp rthruput: 12.75 ns/call 6.73 ns/call 1.89x
 exp latency: 45.91 ns/call 21.80 ns/call 2.11x
 exp2 rthruput: 6.47 ns/call 5.40 ns/call 1.2x
 exp2 latency: 26.03 ns/call 16.54 ns/call 1.57x
math: remove STRICT_ASSIGN macro 2013年09月06日T18:35:55+00:00 Szabolcs Nagy nsz@port70.net 2013年09月06日T18:35:55+00:00 9b0fcb441a44456c7b071c7cdaf90403f81ec05a gcc did not always drop excess precision according to c99 at assignments before version 4.5 even if -std=c99 was requested which caused badly broken mathematical functions on i386 when FLT_EVAL_METHOD!=0 but STRICT_ASSIGN was not used consistently and it is worked around for old compilers with -ffloat-store so it is no longer needed the new convention is to get the compiler respect c99 semantics and when excess precision is not harmful use float_t or double_t or to specialize code using FLT_EVAL_METHOD
gcc did not always drop excess precision according to c99 at assignments
before version 4.5 even if -std=c99 was requested which caused badly
broken mathematical functions on i386 when FLT_EVAL_METHOD!=0
but STRICT_ASSIGN was not used consistently and it is worked around for
old compilers with -ffloat-store so it is no longer needed
the new convention is to get the compiler respect c99 semantics and when
excess precision is not harmful use float_t or double_t or to specialize
code using FLT_EVAL_METHOD
math: fix underflow in exp*.c and long double handling in exp2l 2013年09月05日T11:30:08+00:00 Szabolcs Nagy nsz@port70.net 2013年09月04日T07:51:11+00:00 39c910fb061114e6aa5c3bf2c94b1d7262d62221 * don't care about inexact flag * use double_t and float_t (faster, smaller, more precise on x86) * exp: underflow when result is zero or subnormal and not -inf * exp2: underflow when result is zero or subnormal and not exact * expm1: underflow when result is zero or subnormal * expl: don't underflow on -inf * exp2: fix incorrect comment * expm1: simplify special case handling and overflow properly * expm1: cleanup final scaling and fix negative left shift ub (twopk)
* don't care about inexact flag
* use double_t and float_t (faster, smaller, more precise on x86)
* exp: underflow when result is zero or subnormal and not -inf
* exp2: underflow when result is zero or subnormal and not exact
* expm1: underflow when result is zero or subnormal
* expl: don't underflow on -inf
* exp2: fix incorrect comment
* expm1: simplify special case handling and overflow properly
* expm1: cleanup final scaling and fix negative left shift ub (twopk)
math: expf.c cleanup 2012年11月18日T02:42:09+00:00 Szabolcs Nagy nsz@port70.net 2012年11月18日T02:42:09+00:00 ab1772c597ba8fe0c26400256b12d7a4df23880e similar to exp.c cleanup: use scalbnf, don't return excess precision, drop some optimizatoins. exp.c was changed to be more consistent with expf.c code.
similar to exp.c cleanup: use scalbnf, don't return excess precision,
drop some optimizatoins.
exp.c was changed to be more consistent with expf.c code.
math: exp.c clean up 2012年11月17日T22:22:41+00:00 Szabolcs Nagy nsz@port70.net 2012年11月17日T22:22:41+00:00 bbbf045ce96fe5daae7e220487dc44c9d971bd9d overflow and underflow was incorrect when the result was not stored. an optimization for the 0.5*ln2 < |x| < 1.5*ln2 domain was removed. did various cleanups around static constants and made the comments consistent with the code.
overflow and underflow was incorrect when the result was not stored.
an optimization for the 0.5*ln2 < |x| < 1.5*ln2 domain was removed.
did various cleanups around static constants and made the comments
consistent with the code.
code cleanup of named constants 2012年03月19日T22:41:19+00:00 nsz nsz@port70.net 2012年03月19日T22:41:19+00:00 0cbb65479147ecdaa664e88cc2a5a925f3de502f 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).
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).
fix loads of missing const in new libm, and some global vars (?!) in powl 2012年03月18日T05:58:28+00:00 Rich Felker dalias@aerifal.cx 2012年03月18日T05:58:28+00:00 9e2a895aaaa4a3985e94ae4f3e24c1af65f9bb34
first commit of the new libm! 2012年03月13日T05:17:53+00:00 Rich Felker dalias@aerifal.cx 2012年03月13日T05:17:53+00:00 b69f695acedd4ce2798ef9ea28d834ceccc789bd 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.
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.

AltStyle によって変換されたページ (->オリジナル) /