Back to index

glibc  2.9
Functions | Variables
e_asinl.c File Reference
#include "math.h"
#include "math_private.h"

Go to the source code of this file.

Functions

double __ieee754_asinl (long double x)

Variables

static long double one = 1.0L
static long double huge = 1.0e+4932L
static long double pio2_hi = 1.5707963267948966192021943710788178805159986950457096099853515625L
static long double pio2_lo = 2.9127320560933561582586004641843300502121E-20L
static long double pio4_hi = 7.8539816339744830960109718553940894025800E-1L
static long double pS0 = -1.008714657938491626019651170502036851607E1L
static long double pS1 = 2.331460313214179572063441834101394865259E1L
static long double pS2 = -1.863169762159016144159202387315381830227E1L
static long double pS3 = 5.930399351579141771077475766877674661747E0L
static long double pS4 = -6.121291917696920296944056882932695185001E-1L
static long double pS5 = 3.776934006243367487161248678019350338383E-3L
static long double qS0 = -6.052287947630949712886794360635592886517E1L
static long double qS1 = 1.671229145571899593737596543114258558503E2L
static long double qS2 = -1.707840117062586426144397688315411324388E2L
static long double qS3 = 7.870295154902110425886636075950077640623E1L
static long double qS4 = -1.568433562487314651121702982333303458814E1L

Function Documentation

double __ieee754_asinl ( long double  x)

Definition at line 99 of file e_asinl.c.

{
  long double t, w, p, q, c, r, s;
  int32_t ix;
  u_int32_t se, i0, i1, k;

  GET_LDOUBLE_WORDS (se, i0, i1, x);
  ix = se & 0x7fff;
  ix = (ix << 16) | (i0 >> 16);
  if (ix >= 0x3fff8000)
    {                       /* |x|>= 1 */
      if (ix == 0x3fff8000 && ((i0 - 0x80000000) | i1) == 0)
       /* asin(1)=+-pi/2 with inexact */
       return x * pio2_hi + x * pio2_lo;
      return (x - x) / (x - x);    /* asin(|x|>1) is NaN */
    }
  else if (ix < 0x3ffe8000)
    {                       /* |x|<0.5 */
      if (ix < 0x3fde8000)
       {                    /* if |x| < 2**-33 */
         if (huge + x > one)
           return x;        /* return x with inexact if x!=0 */
       }
      else
       {
         t = x * x;
         p =
           t * (pS0 +
               t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
         q = qS0 + t * (qS1 + t * (qS2 + t * (qS3 + t * (qS4 + t))));
         w = p / q;
         return x + x * w;
       }
    }
  /* 1> |x|>= 0.5 */
  w = one - fabsl (x);
  t = w * 0.5;
  p = t * (pS0 + t * (pS1 + t * (pS2 + t * (pS3 + t * (pS4 + t * pS5)))));
  q = qS0 + t * (qS1 + t * (qS2 + t * (qS3 + t * (qS4 + t))));
  s = __ieee754_sqrtl (t);
  if (ix >= 0x3ffef999)
    {                       /* if |x| > 0.975 */
      w = p / q;
      t = pio2_hi - (2.0 * (s + s * w) - pio2_lo);
    }
  else
    {
      GET_LDOUBLE_WORDS (k, i0, i1, s);
      i1 = 0;
      SET_LDOUBLE_WORDS (w,k,i0,i1);
      c = (t - w * w) / (s + w);
      r = p / q;
      p = 2.0 * s * r - (pio2_lo - 2.0 * c);
      q = pio4_hi - 2.0 * w;
      t = pio4_hi - (p - q);
    }
  if ((se & 0x8000) == 0)
    return t;
  else
    return -t;
}

Here is the call graph for this function:


Variable Documentation

long double huge = 1.0e+4932L [static]

Definition at line 70 of file e_asinl.c.

long double one = 1.0L [static]

Definition at line 69 of file e_asinl.c.

long double pio2_hi = 1.5707963267948966192021943710788178805159986950457096099853515625L [static]

Definition at line 71 of file e_asinl.c.

long double pio2_lo = 2.9127320560933561582586004641843300502121E-20L [static]

Definition at line 72 of file e_asinl.c.

long double pio4_hi = 7.8539816339744830960109718553940894025800E-1L [static]

Definition at line 73 of file e_asinl.c.

long double pS0 = -1.008714657938491626019651170502036851607E1L [static]

Definition at line 80 of file e_asinl.c.

long double pS1 = 2.331460313214179572063441834101394865259E1L [static]

Definition at line 81 of file e_asinl.c.

long double pS2 = -1.863169762159016144159202387315381830227E1L [static]

Definition at line 82 of file e_asinl.c.

long double pS3 = 5.930399351579141771077475766877674661747E0L [static]

Definition at line 83 of file e_asinl.c.

long double pS4 = -6.121291917696920296944056882932695185001E-1L [static]

Definition at line 84 of file e_asinl.c.

long double pS5 = 3.776934006243367487161248678019350338383E-3L [static]

Definition at line 85 of file e_asinl.c.

long double qS0 = -6.052287947630949712886794360635592886517E1L [static]

Definition at line 87 of file e_asinl.c.

long double qS1 = 1.671229145571899593737596543114258558503E2L [static]

Definition at line 88 of file e_asinl.c.

long double qS2 = -1.707840117062586426144397688315411324388E2L [static]

Definition at line 89 of file e_asinl.c.

long double qS3 = 7.870295154902110425886636075950077640623E1L [static]

Definition at line 90 of file e_asinl.c.

long double qS4 = -1.568433562487314651121702982333303458814E1L [static]

Definition at line 91 of file e_asinl.c.