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