summaryrefslogtreecommitdiff
path: root/src/complex/catan.c
AgeCommit message (Collapse)AuthorLines
2019-04-17math: move complex math out of libm.hSzabolcs Nagy-1/+1
This makes it easier to build musl math code with a compiler that does not support complex types (tcc) and in general more sensible factorization of the internal headers.
2018-04-11fix incorrect results for catan with some inputsRich Felker-13/+1
the catan implementation from OpenBSD includes a FIXME-annotated "overflow" branch that produces a meaningless and incorrect large-magnitude result. it was reachable via three paths, corresponding to gotos removed by this commit, in order: 1. pure imaginary argument with imaginary component greater than 1 in magnitude. this case does not seem at all exceptional and is handled (at least with the quality currently expected from our complex math functions) by the existing non-exceptional code path. 2. arguments on the unit circle, including the pure-real argument 1.0. these are not exceptional except for ±i, which should produce results with infinite imaginary component and which lead to computation of atan2(±0,0) in the existing non-exceptional code path. such calls to atan2() however are well-defined by POSIX. 3. the specific argument +i. this route should be unreachable due to the above (2), but subtle rounding effects might have made it possible in rare cases. continuing on the non-exceptional code path in this case would lead to computing the (real) log of an infinite argument, then producing a NAN when multiplying it by I. for now, remove the exceptional code paths entirely. replace the multiplication by I with construction of a complex number using the CMPLX macro so that the NAN issue (3) prevented cannot arise. with these changes, catan should give reasonably correct results for real arguments, and should no longer give completely-wrong results for pure-imaginary arguments outside the interval (-i,+i).
2012-03-13first commit of the new libm!Rich Felker-0/+119
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.