Back to index

glibc  2.9
Functions
sincos32.c File Reference
#include "endian.h"
#include "mpa.h"
#include "sincos32.h"
#include "math_private.h"

Go to the source code of this file.

Functions

static void ss32 (mp_no *x, mp_no *y, int p)
static void cc32 (mp_no *x, mp_no *y, int p)
void __c32 (mp_no *x, mp_no *y, mp_no *z, int p)
double __sin32 (double x, double res, double res1)
double __cos32 (double x, double res, double res1)
double __mpsin (double x, double dx)
double __mpcos (double x, double dx)
int __mpranred (double x, mp_no *y, int p)
double __mpsin1 (double x)
double __mpcos1 (double x)

Function Documentation

void __c32 ( mp_no x,
mp_no y,
mp_no z,
int  p 
)

Definition at line 112 of file sincos32.c.

                                                {
  static const mp_no mpt={1,{1.0,2.0}}, one={1,{1.0,1.0}};
  mp_no u,t,t1,t2,c,s;
  int i;
  __cpy(x,&u,p);
  u.e=u.e-1;
  cc32(&u,&c,p);
  ss32(&u,&s,p);
  for (i=0;i<24;i++) {
    __mul(&c,&s,&t,p);
    __sub(&s,&t,&t1,p);
    __add(&t1,&t1,&s,p);
    __sub(&mpt,&c,&t1,p);
    __mul(&t1,&c,&t2,p);
    __add(&t2,&t2,&c,p);
  }
  __sub(&one,&c,y,p);
  __cpy(&s,z,p);
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __cos32 ( double  x,
double  res,
double  res1 
)

Definition at line 161 of file sincos32.c.

                                                  {
  int p;
  mp_no a,b,c;
  p=32;
  __dbl_mp(res,&a,p);
  __dbl_mp(0.5*(res1-res),&b,p);
  __add(&a,&b,&c,p);
  if (x>2.4)
  { __sub(&pi,&c,&a,p);
    __c32(&a,&b,&c,p);
    b.d[0]=-b.d[0];
  }
  else if (x>0.8)
       { __sub(&hp,&c,&a,p);
         __c32(&a,&c,&b,p);
       }
  else __c32(&c,&b,&a,p);     /* b=cos(0.5*(res+res1))  */
  __dbl_mp(x,&c,p);    /* c = x                  */
  __sub(&b,&c,&a,p);
             /* if a>0 return max(res,res1), otherwise return min(res,res1) */
  if (a.d[0]>0)  return (res>res1)?res:res1;
  else  return (res<res1)?res:res1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __mpcos ( double  x,
double  dx 
)

Definition at line 207 of file sincos32.c.

                                    {
  int p;
  double y;
  mp_no a,b,c;
  p=32;
  __dbl_mp(x,&a,p);
  __dbl_mp(dx,&b,p);
  __add(&a,&b,&c,p);
  if (x>0.8)
  { __sub(&hp,&c,&b,p);
    __c32(&b,&c,&a,p);
  }
  else __c32(&c,&a,&b,p);     /* a = cos(x+dx)     */
  __mp_dbl(&a,&y,p);
  return y;
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __mpcos1 ( double  x)

Definition at line 317 of file sincos32.c.

{
  int p;
  int n;
  mp_no u,s,c;
  double y;

  p=32;
  n=__mpranred(x,&u,p);              /* n is 0, 1, 2 or 3 */
  __c32(&u,&c,&s,p);
  switch (n) {                     /* in what quarter of unit circle y is*/

  case 0:
    __mp_dbl(&c,&y,p);
    return y;
    break;

  case 2:
    __mp_dbl(&c,&y,p);
    return -y;
    break;

  case 1:
    __mp_dbl(&s,&y,p);
    return -y;
    break;

  case 3:
    __mp_dbl(&s,&y,p);
    return y;
    break;

  }
  return 0;                     /* unreachable, to make the compiler happy */
}

Here is the call graph for this function:

Here is the caller graph for this function:

int __mpranred ( double  x,
mp_no y,
int  p 
)

Definition at line 230 of file sincos32.c.

{
  number v;
  double t,xn;
  int i,k,n;
  static const mp_no one = {1,{1.0,1.0}};
  mp_no a,b,c;

  if (ABS(x) < 2.8e14) {
    t = (x*hpinv.d + toint.d);
    xn = t - toint.d;
    v.d = t;
    n =v.i[LOW_HALF]&3;
    __dbl_mp(xn,&a,p);
    __mul(&a,&hp,&b,p);
    __dbl_mp(x,&c,p);
    __sub(&c,&b,y,p);
    return n;
  }
  else {                      /* if x is very big more precision required */
    __dbl_mp(x,&a,p);
    a.d[0]=1.0;
    k = a.e-5;
    if (k < 0) k=0;
    b.e = -k;
    b.d[0] = 1.0;
    for (i=0;i<p;i++) b.d[i+1] = toverp[i+k];
    __mul(&a,&b,&c,p);
    t = c.d[c.e];
    for (i=1;i<=p-c.e;i++) c.d[i]=c.d[i+c.e];
    for (i=p+1-c.e;i<=p;i++) c.d[i]=0;
    c.e=0;
    if (c.d[1] >=  8388608.0)
    { t +=1.0;
      __sub(&c,&one,&b,p);
      __mul(&b,&hp,y,p);
    }
    else __mul(&c,&hp,y,p);
    n = (int) t;
    if (x < 0) { y->d[0] = - y->d[0]; n = -n; }
    return (n&3);
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __mpsin ( double  x,
double  dx 
)

Definition at line 189 of file sincos32.c.

                                    {
  int p;
  double y;
  mp_no a,b,c;
  p=32;
  __dbl_mp(x,&a,p);
  __dbl_mp(dx,&b,p);
  __add(&a,&b,&c,p);
  if (x>0.8) { __sub(&hp,&c,&a,p); __c32(&a,&b,&c,p); }
  else __c32(&c,&a,&b,p);     /* b = sin(x+dx)     */
  __mp_dbl(&b,&y,p);
  return y;
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __mpsin1 ( double  x)

Definition at line 278 of file sincos32.c.

{
  int p;
  int n;
  mp_no u,s,c;
  double y;
  p=32;
  n=__mpranred(x,&u,p);               /* n is 0, 1, 2 or 3 */
  __c32(&u,&c,&s,p);
  switch (n) {                      /* in which quarter of unit circle y is*/
  case 0:
    __mp_dbl(&s,&y,p);
    return y;
    break;

  case 2:
    __mp_dbl(&s,&y,p);
    return -y;
    break;

  case 1:
    __mp_dbl(&c,&y,p);
    return y;
    break;

  case 3:
    __mp_dbl(&c,&y,p);
    return -y;
    break;

  }
  return 0;                     /* unreachable, to make the compiler happy */
}

Here is the call graph for this function:

Here is the caller graph for this function:

double __sin32 ( double  x,
double  res,
double  res1 
)

Definition at line 137 of file sincos32.c.

                                                  {
  int p;
  mp_no a,b,c;
  p=32;
  __dbl_mp(res,&a,p);
  __dbl_mp(0.5*(res1-res),&b,p);
  __add(&a,&b,&c,p);
  if (x>0.8)
  { __sub(&hp,&c,&a,p);
    __c32(&a,&b,&c,p);
  }
  else __c32(&c,&a,&b,p);     /* b=sin(0.5*(res+res1))  */
  __dbl_mp(x,&c,p);           /* c = x                  */
  __sub(&b,&c,&a,p);
  /* if a>0 return min(res,res1), otherwise return max(res,res1) */
  if (a.d[0]>0)  return (res<res1)?res:res1;
  else  return (res>res1)?res:res1;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void cc32 ( mp_no x,
mp_no y,
int  p 
) [static]

Definition at line 82 of file sincos32.c.

                                            {
  int i;
  double a;
#if 0
  double b;
  static const mp_no mpone = {1,{1.0,1.0}};
#endif
  mp_no mpt1,x2,gor,sum ,mpk={1,{1.0}};
#if 0
  mp_no mpt2;
#endif
  for (i=1;i<=p;i++) mpk.d[i]=0;

  __mul(x,x,&x2,p);
  mpk.d[1]=27.0;
  __mul(&oofac27,&mpk,&gor,p);
  __cpy(&gor,&sum,p);
  for (a=26.0;a>2.0;a-=2.0) {
    mpk.d[1]=a*(a-1.0);
    __mul(&gor,&mpk,&mpt1,p);
    __cpy(&mpt1,&gor,p);
    __mul(&x2,&sum,&mpt1,p);
    __sub(&gor,&mpt1,&sum,p);
  }
  __mul(&x2,&sum,y,p);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void ss32 ( mp_no x,
mp_no y,
int  p 
) [static]

Definition at line 52 of file sincos32.c.

                                            {
  int i;
  double a;
#if 0
  double b;
  static const mp_no mpone = {1,{1.0,1.0}};
#endif
  mp_no mpt1,x2,gor,sum ,mpk={1,{1.0}};
#if 0
  mp_no mpt2;
#endif
  for (i=1;i<=p;i++) mpk.d[i]=0;

  __mul(x,x,&x2,p);
  __cpy(&oofac27,&gor,p);
  __cpy(&gor,&sum,p);
  for (a=27.0;a>1.0;a-=2.0) {
    mpk.d[1]=a*(a-1.0);
    __mul(&gor,&mpk,&mpt1,p);
    __cpy(&mpt1,&gor,p);
    __mul(&x2,&sum,&mpt1,p);
    __sub(&gor,&mpt1,&sum,p);
  }
  __mul(x,&sum,y,p);
}

Here is the call graph for this function:

Here is the caller graph for this function: