1:
2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20: 21: 22:
23:
24: #include <sys/cdefs.h>
25: #include <float.h>
26: #include <math.h>
27:
28: #include "math_private.h"
29:
30: static const double zero = 0.0;
31:
32:
33: double
34: remainder(double x, double p)
35: {
36: int32_t hx,hp;
37: u_int32_t sx,lx,lp;
38: double p_half;
39:
40: EXTRACT_WORDS(hx,lx,x);
41: EXTRACT_WORDS(hp,lp,p);
42: sx = hx&0x80000000;
43: hp &= 0x7fffffff;
44: hx &= 0x7fffffff;
45:
46:
47: if((hp|lp)==0) return (x*p)/(x*p);
48: if((hx>=0x7ff00000)||
49: ((hp>=0x7ff00000)&&
50: (((hp-0x7ff00000)|lp)!=0)))
51: return (x*p)/(x*p);
52:
53:
54: if (hp<=0x7fdfffff) x = fmod(x,p+p);
55: if (((hx-hp)|(lx-lp))==0) return zero*x;
56: x = fabs(x);
57: p = fabs(p);
58: if (hp<0x00200000) {
59: if(x+x>p) {
60: x-=p;
61: if(x+x>=p) x -= p;
62: }
63: } else {
64: p_half = 0.5*p;
65: if(x>p_half) {
66: x-=p;
67: if(x>=p_half) x -= p;
68: }
69: }
70: GET_HIGH_WORD(hx,x);
71: SET_HIGH_WORD(x,hx^sx);
72: return x;
73: }
74:
75: #if LDBL_MANT_DIG == 53
76: #ifdef lint
77:
78: long double remainderl(long double, long double);
79: #else
80: __weak_alias(remainderl, remainder);
81: #endif
82: #endif