1 /* $OpenBSD: s_casinl.c,v 1.3 2011/07/20 21:02:51 martynas Exp $ */
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21 * Complex circular arc sine
27 * long double complex casinl();
28 * long double complex z, w;
36 * Inverse complex sine:
39 * w = -i clog( iz + csqrt( 1 - z ) ).
45 * arithmetic domain # trials peak rms
46 * DEC -10,+10 10100 2.1e-15 3.4e-16
47 * IEEE -10,+10 30000 2.2e-14 2.7e-15
48 * Larger relative error can be observed for z near zero.
49 * Also tested by csin(casin(z)) = z.
56 #if LDBL_MANT_DIG == 64
57 static const long double MACHEPL
= 5.42101086242752217003726400434970855712890625E-20L;
58 #elif LDBL_MANT_DIG == 113
59 static const long double MACHEPL
= 9.629649721936179265279889712924636592690508e-35L;
62 static const long double PIO2L
= 1.570796326794896619231321691639751442098585L;
65 casinl(long double complex z
)
67 long double complex w
;
69 long double complex ca
, ct
, zz
, z2
;
75 if (fabsl(x
) > 1.0L) {
77 /*mtherr( "casinl", DOMAIN );*/
80 w
= asinl(x
) + 0.0L * I
;
85 /* Power series expansion */
88 long double complex sum
;
91 z2
= (x
- y
) * (x
+ y
) + (2.0L * x
* y
) * I
;
117 ct
= ca
* I
; /* iz */
119 /* cmul(&ca, &ca, &zz) */
121 zz
= (x
- y
) * (x
+ y
) + (2.0L * x
* y
) * I
;
122 zz
= 1.0L - creall(zz
) - cimagl(zz
) * I
;
127 /* multiply by 1/i = -i */
128 w
= zz
* (-1.0L * I
);