#pragma once

typedef __int32 int32_t;
typedef unsigned __int32 u_int32_t;

typedef union
{
  double value;
  struct
  {
    u_int32_t lsw;
    u_int32_t msw;
  } parts;
} ieee_double_shape_type;

#define EXTRACT_WORDS(ix0,ix1,d)	\
do {								\
  ieee_double_shape_type ew_u;		\
  ew_u.value = (d);					\
  (ix0) = ew_u.parts.msw;			\
  (ix1) = ew_u.parts.lsw;			\
} while (0)

/* Get the more significant 32 bit int from a double.  */

#define GET_HIGH_WORD(i,d)			\
do {								\
  ieee_double_shape_type gh_u;		\
  gh_u.value = (d);				    \
  (i) = gh_u.parts.msw;				\
} while (0)

#define GET_LOW_WORD(i,d)			\
do {								\
  ieee_double_shape_type gl_u;		\
  gl_u.value = (d);					\
  (i) = gl_u.parts.lsw;				\
} while (0)

static __inline double __ieee754_sqrt(double x) {return sqrt(x);}
static __inline double __ieee754_log(double x) {return log(x);}
static __inline double __cos(double x) {return cos(x);}
static __inline void __sincos(double x, double *s, double *c)
{
    *s = sin(x);
    *c = cos(x);
}

double __ieee754_j0(double);
double __ieee754_j1(double);
double __ieee754_jn(int, double);
double __ieee754_y0(double);
double __ieee754_y1(double);
double __ieee754_yn(int, double);