xref: /freebsd/lib/msun/src/s_csinhf.c (revision 3daee1d6c3783e32a226d145f85a887007f5754b)
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