diff options
Diffstat (limited to 'src/complex/cacos.c')
| -rw-r--r-- | src/complex/cacos.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/src/complex/cacos.c b/src/complex/cacos.c index b669f478..3bfe9d38 100644 --- a/src/complex/cacos.c +++ b/src/complex/cacos.c @@ -1,10 +1,69 @@ # define TGSOURCE "../complex/cacos.c" #include "_tgmath.h" - #include <complex.h> +#include "math.h" +#include "fenv.h" + +#include "../math/M_PI.c" +#include "../math/M_PI_2.c" +#include "../math/M_PI_4.c" TYPE complex TGFN(cacos)(TYPE complex z) { + int classr = fpclassify(TGFN(creal)(z)); + int classi = fpclassify(TGFN(cimag)(z)); + int signr = signbit(TGFN(creal)(z)); + int signi = signbit(TGFN(cimag)(z)); + + if (classr == FP_ZERO && classi == FP_ZERO) { + return TGCMPLX(M_PI_2, 0.0); + } + + if (classr == FP_ZERO && classi == FP_NAN) { + return TGCMPLX(M_PI_2, NAN); + } + + if (classr != FP_INFINITE && classi == FP_INFINITE) { + return TGCMPLX(M_PI_2, INFINITY); + } + + if (classr != FP_ZERO && classr != FP_INFINITE && classi == FP_NAN) { + return TGCMPLX(NAN, NAN); + } + + if (classr == FP_INFINITE && signr && classi != FP_INFINITE && !signi) { + return TGCMPLX(M_PI, -INFINITY); + } + + if (classr == FP_INFINITE && !signr && classi != FP_INFINITE && !signi) { + return TGCMPLX(0.0, -INFINITY); + } + + if (classr == FP_INFINITE && signr && classi == FP_INFINITE) { + return TGCMPLX(3 * M_PI_4, -INFINITY); + } + + if (classr == FP_INFINITE && !signr && classi == FP_INFINITE) { + return TGCMPLX(M_PI_4, -INFINITY); + } + + if (classr == FP_INFINITE && classi == FP_NAN) { + return TGCMPLX(NAN, INFINITY); + } + + if (classr == FP_NAN && classi != FP_INFINITE) { + feraiseexcept(FE_INVALID); + return TGCMPLX(NAN, NAN); + } + + if (classr == NAN && classi == FP_INFINITE) { + return TGCMPLX(NAN, -INFINITY); + } + + if (classr == NAN && classi == NAN) { + return TGCMPLX(NAN, NAN); + } + return z; } |
