X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fasinl.c;h=c7ba71df88fc4e988bff450a0e6e3d037a960aad;hb=96269bbd2c9c35940341c978261587bdf3bcda78;hp=3b896fa39b946a5bf6c046026645765afa02ddb1;hpb=e1123c2f4fedae90435426a82a05cf2e3233e97d;p=gnulib.git diff --git a/lib/asinl.c b/lib/asinl.c index 3b896fa39..c7ba71df8 100644 --- a/lib/asinl.c +++ b/lib/asinl.c @@ -14,6 +14,18 @@ /* Specification. */ #include +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +asinl (long double x) +{ + return asin (x); +} + +#else + +/* Code based on glibc/sysdeps/ieee754/ldbl-128/e_asinl.c. */ + /* Long double expansions contributed by Stephen L. Moshier @@ -21,17 +33,17 @@ /* asin(x) * Method : - * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... - * we approximate asin(x) on [0,0.5] by - * asin(x) = x + x*x^2*R(x^2) + * Since asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ... + * we approximate asin(x) on [0,0.5] by + * asin(x) = x + x*x^2*R(x^2) * Between .5 and .625 the approximation is * asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x) - * For x in [0.625,1] - * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) + * For x in [0.625,1] + * asin(x) = pi/2-2*asin(sqrt((1-x)/2)) * * Special cases: - * if x is NaN, return x itself; - * if |x|>1, return NaN with invalid signal. + * if x is NaN, return x itself; + * if |x|>1, return NaN with invalid signal. * */ @@ -43,7 +55,7 @@ static const long double pio2_lo = 4.3359050650618905123985220130216759843812E-35L, pio4_hi = 7.8539816339744830961566084581987569936977E-1L, - /* coefficient for R(x^2) */ + /* coefficient for R(x^2) */ /* asin(x) = x + x^3 pS(x^2) / qS(x^2) 0 <= x <= 0.5 @@ -114,19 +126,19 @@ asinl (long double x) y = -x; } - if (y >= 1.0L) /* |x|>= 1 */ + if (y >= 1.0L) /* |x|>= 1 */ { if (y == 1.0L) - /* asin(1)=+-pi/2 with inexact */ - return x * pio2_hi + x * pio2_lo; + /* asin(1)=+-pi/2 with inexact */ + return x * pio2_hi + x * pio2_lo; - return (x - x) / (x - x); /* asin(|x|>1) is NaN */ + return (x - x) / (x - x); /* asin(|x|>1) is NaN */ } else if (y < 0.5L) /* |x| < 0.5 */ { if (y < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */ - if (huge + y > one) - return y; /* return x with inexact if x!=0 */ + if (huge + y > one) + return y; /* return x with inexact if x!=0 */ t = x * x; p = (((((((((pS9 * t @@ -158,63 +170,65 @@ asinl (long double x) { t = y - 0.5625; p = ((((((((((rS10 * t - + rS9) * t - + rS8) * t - + rS7) * t - + rS6) * t - + rS5) * t - + rS4) * t - + rS3) * t - + rS2) * t - + rS1) * t - + rS0) * t; + + rS9) * t + + rS8) * t + + rS7) * t + + rS6) * t + + rS5) * t + + rS4) * t + + rS3) * t + + rS2) * t + + rS1) * t + + rS0) * t; q = ((((((((( t - + sS9) * t - + sS8) * t - + sS7) * t - + sS6) * t - + sS5) * t - + sS4) * t - + sS3) * t - + sS2) * t - + sS1) * t - + sS0; + + sS9) * t + + sS8) * t + + sS7) * t + + sS6) * t + + sS5) * t + + sS4) * t + + sS3) * t + + sS2) * t + + sS1) * t + + sS0; t = asinr5625 + p / q; } else - t = pio2_hi + pio2_lo - 2 * asinl(sqrtl((1-y)/2)); + t = pio2_hi + pio2_lo - 2 * asinl (sqrtl ((1 - y) / 2)); return t * sign; } +#endif + #if 0 int main (void) { printf ("%.18Lg %.18Lg\n", - asinl(1.0L), + asinl (1.0L), 1.5707963267948966192313216916397514420984L); printf ("%.18Lg %.18Lg\n", - asinl(0.7071067811865475244008443621048490392848L), + asinl (0.7071067811865475244008443621048490392848L), 0.7853981633974483096156608458198757210492L); printf ("%.18Lg %.18Lg\n", - asinl(0.5L), + asinl (0.5L), 0.5235987755982988730771072305465838140328L); printf ("%.18Lg %.18Lg\n", - asinl(0.3090169943749474241022934171828190588600L), + asinl (0.3090169943749474241022934171828190588600L), 0.3141592653589793238462643383279502884196L); printf ("%.18Lg %.18Lg\n", - asinl(-1.0L), + asinl (-1.0L), -1.5707963267948966192313216916397514420984L); printf ("%.18Lg %.18Lg\n", - asinl(-0.7071067811865475244008443621048490392848L), + asinl (-0.7071067811865475244008443621048490392848L), -0.7853981633974483096156608458198757210492L); printf ("%.18Lg %.18Lg\n", - asinl(-0.5L), + asinl (-0.5L), -0.5235987755982988730771072305465838140328L); printf ("%.18Lg %.18Lg\n", - asinl(-0.3090169943749474241022934171828190588600L), + asinl (-0.3090169943749474241022934171828190588600L), -0.3141592653589793238462643383279502884196L); } #endif