1*3daee1d6SDavid Schultz /*- 2*3daee1d6SDavid Schultz * Copyright (c) 2005 Bruce D. Evans and Steven G. Kargl 3*3daee1d6SDavid Schultz * All rights reserved. 4*3daee1d6SDavid Schultz * 5*3daee1d6SDavid Schultz * Redistribution and use in source and binary forms, with or without 6*3daee1d6SDavid Schultz * modification, are permitted provided that the following conditions 7*3daee1d6SDavid Schultz * are met: 8*3daee1d6SDavid Schultz * 1. Redistributions of source code must retain the above copyright 9*3daee1d6SDavid Schultz * notice unmodified, this list of conditions, and the following 10*3daee1d6SDavid Schultz * disclaimer. 11*3daee1d6SDavid Schultz * 2. Redistributions in binary form must reproduce the above copyright 12*3daee1d6SDavid Schultz * notice, this list of conditions and the following disclaimer in the 13*3daee1d6SDavid Schultz * documentation and/or other materials provided with the distribution. 14*3daee1d6SDavid Schultz * 15*3daee1d6SDavid Schultz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16*3daee1d6SDavid Schultz * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17*3daee1d6SDavid Schultz * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18*3daee1d6SDavid Schultz * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19*3daee1d6SDavid Schultz * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20*3daee1d6SDavid Schultz * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21*3daee1d6SDavid Schultz * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22*3daee1d6SDavid Schultz * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23*3daee1d6SDavid Schultz * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24*3daee1d6SDavid Schultz * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25*3daee1d6SDavid Schultz */ 26*3daee1d6SDavid Schultz 27*3daee1d6SDavid Schultz /* 28*3daee1d6SDavid Schultz * Hyperbolic sine of a complex argument z. See s_csinh.c for details. 29*3daee1d6SDavid Schultz */ 30*3daee1d6SDavid Schultz 31*3daee1d6SDavid Schultz #include <sys/cdefs.h> 32*3daee1d6SDavid Schultz __FBSDID("$FreeBSD$"); 33*3daee1d6SDavid Schultz 34*3daee1d6SDavid Schultz #include <complex.h> 35*3daee1d6SDavid Schultz #include <math.h> 36*3daee1d6SDavid Schultz 37*3daee1d6SDavid Schultz #include "math_private.h" 38*3daee1d6SDavid Schultz 39*3daee1d6SDavid Schultz float complex 40*3daee1d6SDavid Schultz csinhf(float complex z) 41*3daee1d6SDavid Schultz { 42*3daee1d6SDavid Schultz float x, y; 43*3daee1d6SDavid Schultz int32_t hx, hy, ix, iy; 44*3daee1d6SDavid Schultz 45*3daee1d6SDavid Schultz x = crealf(z); 46*3daee1d6SDavid Schultz y = cimagf(z); 47*3daee1d6SDavid Schultz 48*3daee1d6SDavid Schultz GET_FLOAT_WORD(hx, x); 49*3daee1d6SDavid Schultz GET_FLOAT_WORD(hy, y); 50*3daee1d6SDavid Schultz 51*3daee1d6SDavid Schultz ix = 0x7fffffff & hx; 52*3daee1d6SDavid Schultz iy = 0x7fffffff & hy; 53*3daee1d6SDavid Schultz 54*3daee1d6SDavid Schultz if (ix < 0x7f800000 && iy < 0x7f800000) { 55*3daee1d6SDavid Schultz if (iy == 0) 56*3daee1d6SDavid Schultz return (cpackf(sinhf(x), y)); 57*3daee1d6SDavid Schultz /* XXX We don't handle |x| > FLT_MAX ln(2) yet. */ 58*3daee1d6SDavid Schultz return (cpackf(sinhf(x) * cosf(y), coshf(x) * sinf(y))); 59*3daee1d6SDavid Schultz } 60*3daee1d6SDavid Schultz 61*3daee1d6SDavid Schultz if (ix == 0 && iy >= 0x7f800000) 62*3daee1d6SDavid Schultz return (cpackf(copysignf(0, x * (y - y)), y - y)); 63*3daee1d6SDavid Schultz 64*3daee1d6SDavid Schultz if (iy == 0 && ix >= 0x7f800000) { 65*3daee1d6SDavid Schultz if ((hx & 0x7fffff) == 0) 66*3daee1d6SDavid Schultz return (cpackf(x, copysignf(0, x) * y)); 67*3daee1d6SDavid Schultz return (cpackf(x, copysignf(0, y))); 68*3daee1d6SDavid Schultz } 69*3daee1d6SDavid Schultz 70*3daee1d6SDavid Schultz if (ix < 0x7f800000 && iy >= 0x7f800000) 71*3daee1d6SDavid Schultz return (cpackf(y - y, x * (y - y))); 72*3daee1d6SDavid Schultz 73*3daee1d6SDavid Schultz if (ix >= 0x7f800000 && (hx & 0x7fffff) == 0) { 74*3daee1d6SDavid Schultz if (iy >= 0x7f800000) 75*3daee1d6SDavid Schultz return (cpackf(x * x, x * (y - y))); 76*3daee1d6SDavid Schultz return (cpackf(x * cosf(y), INFINITY * sinf(y))); 77*3daee1d6SDavid Schultz } 78*3daee1d6SDavid Schultz 79*3daee1d6SDavid Schultz return (cpackf((x * x) * (y - y), (x + x) * (y - y))); 80*3daee1d6SDavid Schultz } 81*3daee1d6SDavid Schultz 82*3daee1d6SDavid Schultz float complex 83*3daee1d6SDavid Schultz csinf(float complex z) 84*3daee1d6SDavid Schultz { 85*3daee1d6SDavid Schultz 86*3daee1d6SDavid Schultz z = csinhf(cpackf(-cimagf(z), crealf(z))); 87*3daee1d6SDavid Schultz return (cpackf(cimagf(z), -crealf(z))); 88*3daee1d6SDavid Schultz } 89