X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fcosl.c;h=d4485480f6b276ab8e47ea445d8a3e686ce8e844;hb=43593319b31e6b0175b8eec4433bac744959822d;hp=53df794a1e28f9d1f7fdf5c02e63155f36581dcd;hpb=441aa3044f43e5572f58c354f01e6bc070acd5c7;p=gnulib.git diff --git a/lib/cosl.c b/lib/cosl.c index 53df794a1..d4485480f 100644 --- a/lib/cosl.c +++ b/lib/cosl.c @@ -18,12 +18,24 @@ /* Specification. */ #include -/* sinl(x) - * Return sine function of x. +#if HAVE_SAME_LONG_DOUBLE_AS_DOUBLE + +long double +cosl (long double x) +{ + return cos (x); +} + +#else + +/* Code based on glibc/sysdeps/ieee754/ldbl-128/s_cosl.c. */ + +/* cosl(x) + * Return cosine function of x. * * kernel function: * __kernel_sinl ... sine function on [-pi/4,pi/4] - * __kernel_cosl ... cose function on [-pi/4,pi/4] + * __kernel_cosl ... cosine function on [-pi/4,pi/4] * __ieee754_rem_pio2l ... argument reduction routine * * Method. @@ -49,54 +61,58 @@ * TRIG(x) returns trig(x) nearly rounded */ -#include "trigl.h" -#ifdef HAVE_SINL -#include "trigl.c" -#include "sincosl.c" -#endif +# include "trigl.h" -long double cosl(long double x) +long double +cosl (long double x) { - long double y[2],z=0.0L; - int n; - - /* cosl(NaN) is NaN */ - if (isnanl (x)) - return x; - - /* |x| ~< pi/4 */ - if(x >= -0.7853981633974483096156608458198757210492 && - x <= 0.7853981633974483096156608458198757210492) - return kernel_cosl(x, z); - - /* cosl(Inf) is NaN, cosl(0) is 1 */ - else if (x + x == x && x != 0.0) - return x-x; /* NaN */ - - /* argument reduction needed */ - else { - n = ieee754_rem_pio2l(x,y); - switch(n&3) { - case 0: return kernel_cosl(y[0],y[1]); - case 1: return -kernel_sinl(y[0],y[1],1); - case 2: return -kernel_cosl(y[0],y[1]); - default: - return kernel_sinl(y[0],y[1],1); - } + long double y[2],z=0.0L; + int n; + + /* cosl(NaN) is NaN */ + if (isnanl (x)) + return x; + + /* |x| ~< pi/4 */ + if (x >= -0.7853981633974483096156608458198757210492 + && x <= 0.7853981633974483096156608458198757210492) + return kernel_cosl(x, z); + + /* cosl(Inf) is NaN, cosl(0) is 1 */ + else if (x + x == x && x != 0.0) + return x - x; /* NaN */ + + /* argument reduction needed */ + else + { + n = ieee754_rem_pio2l (x, y); + switch (n & 3) + { + case 0: + return kernel_cosl (y[0], y[1]); + case 1: + return -kernel_sinl (y[0], y[1], 1); + case 2: + return -kernel_cosl (y[0], y[1]); + default: + return kernel_sinl (y[0], y[1], 1); } + } } +#endif + #if 0 int main (void) { - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *29)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *2)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *30)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *4)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *32)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *2/3)); - printf ("%.16Lg\n", cosl(0.7853981633974483096156608458198757210492 *4/3)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *29)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *2)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *30)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *4)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *32)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *2/3)); + printf ("%.16Lg\n", cosl (0.7853981633974483096156608458198757210492 *4/3)); } #endif