/* doasin.c sincos32.c dosincos.c mpa.c */
/* sincos.tbl asincos.tbl powtwo.tbl root.tbl */
/* */
-/* Ultimate asin/acos routines. Given an IEEE double machine */
-/* number x, compute the correctly rounded value of */
-/* arcsin(x)or arccos(x) according to the function called. */
-/* Assumption: Machine arithmetic operations are performed in */
-/* round to nearest mode of IEEE 754 standard. */
-/* */
/******************************************************************/
#include "endian.h"
#include "mydefs.h"
void __dubsin(double x, double dx, double v[]);
void __dubcos(double x, double dx, double v[]);
void __docos(double x, double dx, double v[]);
-double __sin32(double x, double res, double res1);
-double __cos32(double x, double res, double res1);
-/***************************************************************************/
-/* An ultimate asin routine. Given an IEEE double machine number x */
-/* it computes the correctly rounded (to nearest) value of arcsin(x) */
-/***************************************************************************/
double
SECTION
__ieee754_asin(double x){
if (res == res+1.00014*cor) return res;
else {
__doasin(x,0,w);
- if (w[0]==(w[0]+1.00000001*w[1])) return w[0];
- else {
- y=fabs(x);
- res=fabs(w[0]);
- res1=fabs(w[0]+1.1*w[1]);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
- }
+ return w[0];
}
}
}
if (z>1.0e-27) return (m>0)?min(res,res1):-min(res,res1);
else if (z<-1.0e-27) return (m>0)?max(res,res1):-max(res,res1);
else {
- y=fabs(x);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
+ return (m>0)?res:-res;
}
}
}
if (z>1.0e-27) return (m>0)?min(res,res1):-min(res,res1);
else if (z<-1.0e-27) return (m>0)?max(res,res1):-max(res,res1);
else {
- y=fabs(x);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
+ return (m>0)?res:-res;
}
}
}
if (z>1.0e-27) return (m>0)?min(res,res1):-min(res,res1);
else if (z<-1.0e-27) return (m>0)?max(res,res1):-max(res,res1);
else {
- y=fabs(x);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
+ return (m>0)?res:-res;
}
}
}
if (z>1.0e-27) return (m>0)?min(res,res1):-min(res,res1);
else if (z<-1.0e-27) return (m>0)?max(res,res1):-max(res,res1);
else {
- y=fabs(x);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
+ return (m>0)?res:-res;
}
}
}
if (z>1.0e-27) return (m>0)?min(res,res1):-min(res,res1);
else if (z<-1.0e-27) return (m>0)?max(res,res1):-max(res,res1);
else {
- y=fabs(x);
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
+ return (m>0)?res:-res;
}
}
}
res1=hp0.x-2.0*w[0];
cor=((hp0.x-res1)-2.0*w[0])+(hp1.x-2.0*w[1]);
res = res1+cor;
- cor = (res1-res)+cor;
- if (res==(res+1.0000001*cor)) return (m>0)?res:-res;
- else {
- y=fabs(x);
- res1=res+1.1*cor;
- return (m>0)?__sin32(y,res,res1):-__sin32(y,res,res1);
- }
+ return (m>0)?res:-res;
}
} /* else if (k < 0x3ff00000) */
/*---------------------------- |x|>=1 -------------------------------*/
r=hp0.x-w[0];
cor=((hp0.x-r)-w[0])+(hp1.x-w[1]);
res=r+cor;
- cor=(r-res)+cor;
- if (res ==(res +1.00000001*cor)) return res;
- else {
- res1=res+1.1*cor;
- return __cos32(x,res,res1);
- }
+ return res;
}
}
} /* else if (k < 0x3fc00000) */
z=(w[0]-x)+w[1];
if (z>1.0e-27) return max(res,res1);
else if (z<-1.0e-27) return min(res,res1);
- else return __cos32(x,res,res1);
+ else return res;
}
}
} /* else if (k < 0x3fe00000) */
z=(w[0]-x)+w[1];
if (z>1.0e-27) return max(res,res1);
else if (z<-1.0e-27) return min(res,res1);
- else return __cos32(x,res,res1);
+ else return res;
}
}
} /* else if (k < 0x3fe80000) */
z=(w[0]-x)+w[1];
if (z>1.0e-27) return max(res,res1);
else if (z<-1.0e-27) return min(res,res1);
- else return __cos32(x,res,res1);
+ else return res;
}
}
} /* else if (k < 0x3fed8000) */
z=(w[0]-x)+w[1];
if (z>1.0e-27) return max(res,res1);
else if (z<-1.0e-27) return min(res,res1);
- else return __cos32(x,res,res1);
+ else return res;
}
}
} /* else if (k < 0x3fee8000) */
z=(w[0]-x)+w[1];
if (z>1.0e-27) return max(res,res1);
else if (z<-1.0e-27) return min(res,res1);
- else return __cos32(x,res,res1);
+ else return res;
}
}
} /* else if (k < 0x3fef0000) */
res1=hp0.x-w[0];
cor=((hp0.x-res1)-w[0])+(hp1.x-w[1]);
res = res1+cor;
- cor = (res1-res)+cor;
- if (res==(res+1.000001*cor)) return (res+res);
- else {
- res=res+res;
- res1=res+1.2*cor;
- return __cos32(x,res,res1);
- }
+ return (res+res);
}
}
else {
cc=(y-c)+cc;
__doasin(c,cc,w);
res = w[0];
- cor=w[1];
- if (res==(res+1.000001*cor)) return (res+res);
- else {
- res=res+res;
- res1=res+1.2*cor;
- return __cos32(x,res,res1);
- }
+ return (res+res);
}
}
} /* else if (k < 0x3ff00000) */