123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #include "cdefs-compat.h"
- #include <openlibm_complex.h>
- #include <openlibm_math.h>
- #include "math_private.h"
- static const double huge = 0x1p1023;
- DLLEXPORT double complex
- csinh(double complex z)
- {
- double x, y, h;
- int32_t hx, hy, ix, iy, lx, ly;
- x = creal(z);
- y = cimag(z);
- EXTRACT_WORDS(hx, lx, x);
- EXTRACT_WORDS(hy, ly, y);
- ix = 0x7fffffff & hx;
- iy = 0x7fffffff & hy;
-
- if (ix < 0x7ff00000 && iy < 0x7ff00000) {
- if ((iy | ly) == 0)
- return (CMPLX(sinh(x), y));
- if (ix < 0x40360000)
- return (CMPLX(sinh(x) * cos(y), cosh(x) * sin(y)));
-
- if (ix < 0x40862e42) {
-
- h = exp(fabs(x)) * 0.5;
- return (CMPLX(copysign(h, x) * cos(y), h * sin(y)));
- } else if (ix < 0x4096bbaa) {
-
- z = __ldexp_cexp(CMPLX(fabs(x), y), -1);
- return (CMPLX(creal(z) * copysign(1, x), cimag(z)));
- } else {
-
- h = huge * x;
- return (CMPLX(h * cos(y), h * h * sin(y)));
- }
- }
-
- if ((ix | lx) == 0 && iy >= 0x7ff00000)
- return (CMPLX(copysign(0, x * (y - y)), y - y));
-
- if ((iy | ly) == 0 && ix >= 0x7ff00000) {
- if (((hx & 0xfffff) | lx) == 0)
- return (CMPLX(x, y));
- return (CMPLX(x, copysign(0, y)));
- }
-
- if (ix < 0x7ff00000 && iy >= 0x7ff00000)
- return (CMPLX(y - y, x * (y - y)));
-
- if (ix >= 0x7ff00000 && ((hx & 0xfffff) | lx) == 0) {
- if (iy >= 0x7ff00000)
- return (CMPLX(x * x, x * (y - y)));
- return (CMPLX(x * cos(y), INFINITY * sin(y)));
- }
-
- return (CMPLX((x * x) * (y - y), (x + x) * (y - y)));
- }
- DLLEXPORT double complex
- csin(double complex z)
- {
-
- z = csinh(CMPLX(-cimag(z), creal(z)));
- return (CMPLX(cimag(z), -creal(z)));
- }
|