12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #include "cdefs-compat.h"
- #include <float.h>
- #include <openlibm_math.h>
- #include "math_private.h"
- static const double
- c1pio2 = 1*M_PI_2,
- c2pio2 = 2*M_PI_2,
- c3pio2 = 3*M_PI_2,
- c4pio2 = 4*M_PI_2;
- OLM_DLLEXPORT float
- cosf(float x)
- {
- double y;
- int32_t n, hx, ix;
- GET_FLOAT_WORD(hx,x);
- ix = hx & 0x7fffffff;
- if(ix <= 0x3f490fda) {
- if(ix<0x39800000)
- if(((int)x)==0) return 1.0;
- return __kernel_cosdf(x);
- }
- if(ix<=0x407b53d1) {
- if(ix<=0x4016cbe3) {
- if(hx>0)
- return __kernel_sindf(c1pio2 - x);
- else
- return __kernel_sindf(x + c1pio2);
- } else
- return -__kernel_cosdf(x + (hx > 0 ? -c2pio2 : c2pio2));
- }
- if(ix<=0x40e231d5) {
- if(ix<=0x40afeddf) {
- if(hx>0)
- return __kernel_sindf(x - c3pio2);
- else
- return __kernel_sindf(-c3pio2 - x);
- } else
- return __kernel_cosdf(x + (hx > 0 ? -c4pio2 : c4pio2));
- }
-
- else if (ix>=0x7f800000) return x-x;
-
- else {
- n = __ieee754_rem_pio2f(x,&y);
- switch(n&3) {
- case 0: return __kernel_cosdf(y);
- case 1: return __kernel_sindf(-y);
- case 2: return -__kernel_cosdf(y);
- default:
- return __kernel_sindf(y);
- }
- }
- }
|