X-Git-Url: http://nsz.repo.hu/git/?p=libm;a=blobdiff_plain;f=src%2Fcmath%2Fcasin.c;h=79aff2789de96c0e8728fb0d3b6b25f9d114c800;hp=34284579dd404478f708dcd3dd25976b9ae0a244;hb=5718e964d8a5c273a91b4d86d16926f54151c58f;hpb=1eb8d023d8b5c286908af676cb405a2ba598d286 diff --git a/src/cmath/casin.c b/src/cmath/casin.c index 3428457..79aff27 100644 --- a/src/cmath/casin.c +++ b/src/cmath/casin.c @@ -1,120 +1,16 @@ -/* origin: OpenBSD /usr/src/lib/libm/src/s_casin.c */ -/* - * Copyright (c) 2008 Stephen L. Moshier - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -/* - * Complex circular arc sine - * - * - * SYNOPSIS: - * - * double complex casin(); - * double complex z, w; - * - * w = casin (z); - * - * - * DESCRIPTION: - * - * Inverse complex sine: - * - * 2 - * w = -i clog( iz + csqrt( 1 - z ) ). - * - * casin(z) = -i casinh(iz) - * - * ACCURACY: - * - * Relative error: - * arithmetic domain # trials peak rms - * DEC -10,+10 10100 2.1e-15 3.4e-16 - * IEEE -10,+10 30000 2.2e-14 2.7e-15 - * Larger relative error can be observed for z near zero. - * Also tested by csin(casin(z)) = z. - */ - #include "libm.h" +// FIXME + +/* asin(z) = -i log(i z + sqrt(1 - z*z)) */ + double complex casin(double complex z) { double complex w; - static double complex ca, ct, zz, z2; double x, y; x = creal(z); y = cimag(z); - - if (y == 0.0) { - if (fabs(x) > 1.0) - w = M_PI_2 + 0.0 * I; - else - w = asin(x) + 0.0 * I; - return w; - } - - /* Power series expansion */ - /* - b = cabs(z); - if( b < 0.125 ) { - z2.r = (x - y) * (x + y); - z2.i = 2.0 * x * y; - - cn = 1.0; - n = 1.0; - ca.r = x; - ca.i = y; - sum.r = x; - sum.i = y; - do { - ct.r = z2.r * ca.r - z2.i * ca.i; - ct.i = z2.r * ca.i + z2.i * ca.r; - ca.r = ct.r; - ca.i = ct.i; - - cn *= n; - n += 1.0; - cn /= n; - n += 1.0; - b = cn/n; - - ct.r *= b; - ct.i *= b; - sum.r += ct.r; - sum.i += ct.i; - b = fabs(ct.r) + fabs(ct.i); - } - while( b > MACHEP ); - w->r = sum.r; - w->i = sum.i; - return; - } - */ - - ca = x + y * I; - ct = ca * I; - /* sqrt(1 - z*z) */ - /* cmul(&ca, &ca, &zz) */ - /* x * x - y * y */ - // FIXME: 1 - ()() - () I - zz = (x - y) * (x + y) + (2.0 * x * y) * I; - zz = 1.0 - creal(zz) - cimag(zz) * I; - z2 = csqrt(zz); - zz = ct + z2; - zz = clog(zz); - /* multiply by 1/i = -i */ - // FIXME: -I - w = zz * (-1.0 * I); - return w; + w = cpack(1.0 - (x - y)*(x + y), -2.0*x*y); + return clog(cpack(-y, x) + csqrt(w)); }