1 //========================================================================
5 // Fixed point type, with C++ operators.
7 // Copyright 2004 Glyph & Cog, LLC
9 //========================================================================
18 #ifdef USE_GCC_PRAGMAS
26 #define fixptMaskL ((1 << fixptShift) - 1)
27 #define fixptMaskH (~fixptMaskL)
29 typedef long long FixPtInt64
;
34 FixedPoint() { val
= 0; }
35 FixedPoint(const FixedPoint
&x
) { val
= x
.val
; }
36 FixedPoint(double x
) { val
= (int)(x
* (1 << fixptShift
) + 0.5); }
37 FixedPoint(int x
) { val
= x
<< fixptShift
; }
38 FixedPoint(long x
) { val
= x
<< fixptShift
; }
41 { return (float) val
* ((float)1 / (float)(1 << fixptShift
)); }
43 { return (double) val
* (1.0 / (double)(1 << fixptShift
)); }
45 { return val
>> fixptShift
; }
47 int getRaw() { return val
; }
49 FixedPoint
operator =(FixedPoint x
) { val
= x
.val
; return *this; }
51 int operator ==(FixedPoint x
) { return val
== x
.val
; }
52 int operator ==(double x
) { return *this == (FixedPoint
)x
; }
53 int operator ==(int x
) { return *this == (FixedPoint
)x
; }
54 int operator ==(long x
) { return *this == (FixedPoint
)x
; }
56 int operator !=(FixedPoint x
) { return val
!= x
.val
; }
57 int operator !=(double x
) { return *this != (FixedPoint
)x
; }
58 int operator !=(int x
) { return *this != (FixedPoint
)x
; }
59 int operator !=(long x
) { return *this != (FixedPoint
)x
; }
61 int operator <(FixedPoint x
) { return val
< x
.val
; }
62 int operator <(double x
) { return *this < (FixedPoint
)x
; }
63 int operator <(int x
) { return *this < (FixedPoint
)x
; }
64 int operator <(long x
) { return *this < (FixedPoint
)x
; }
66 int operator <=(FixedPoint x
) { return val
<= x
.val
; }
67 int operator <=(double x
) { return *this <= (FixedPoint
)x
; }
68 int operator <=(int x
) { return *this <= (FixedPoint
)x
; }
69 int operator <=(long x
) { return *this <= (FixedPoint
)x
; }
71 int operator >(FixedPoint x
) { return val
> x
.val
; }
72 int operator >(double x
) { return *this > (FixedPoint
)x
; }
73 int operator >(int x
) { return *this > (FixedPoint
)x
; }
74 int operator >(long x
) { return *this > (FixedPoint
)x
; }
76 int operator >=(FixedPoint x
) { return val
>= x
.val
; }
77 int operator >=(double x
) { return *this >= (FixedPoint
)x
; }
78 int operator >=(int x
) { return *this >= (FixedPoint
)x
; }
79 int operator >=(long x
) { return *this >= (FixedPoint
)x
; }
81 FixedPoint
operator -() { return make(-val
); }
83 FixedPoint
operator +(FixedPoint x
) { return make(val
+ x
.val
); }
84 FixedPoint
operator +(double x
) { return *this + (FixedPoint
)x
; }
85 FixedPoint
operator +(int x
) { return *this + (FixedPoint
)x
; }
86 FixedPoint
operator +(long x
) { return *this + (FixedPoint
)x
; }
88 FixedPoint
operator +=(FixedPoint x
) { val
= val
+ x
.val
; return *this; }
89 FixedPoint
operator +=(double x
) { return *this += (FixedPoint
)x
; }
90 FixedPoint
operator +=(int x
) { return *this += (FixedPoint
)x
; }
91 FixedPoint
operator +=(long x
) { return *this += (FixedPoint
)x
; }
93 FixedPoint
operator -(FixedPoint x
) { return make(val
- x
.val
); }
94 FixedPoint
operator -(double x
) { return *this - (FixedPoint
)x
; }
95 FixedPoint
operator -(int x
) { return *this - (FixedPoint
)x
; }
96 FixedPoint
operator -(long x
) { return *this - (FixedPoint
)x
; }
98 FixedPoint
operator -=(FixedPoint x
) { val
= val
- x
.val
; return *this; }
99 FixedPoint
operator -=(double x
) { return *this -= (FixedPoint
)x
; }
100 FixedPoint
operator -=(int x
) { return *this -= (FixedPoint
)x
; }
101 FixedPoint
operator -=(long x
) { return *this -= (FixedPoint
)x
; }
103 FixedPoint
operator *(FixedPoint x
) { return make(mul(val
, x
.val
)); }
104 FixedPoint
operator *(double x
) { return *this * (FixedPoint
)x
; }
105 FixedPoint
operator *(int x
) { return *this * (FixedPoint
)x
; }
106 FixedPoint
operator *(long x
) { return *this * (FixedPoint
)x
; }
108 FixedPoint
operator *=(FixedPoint x
) { val
= mul(val
, x
.val
); return *this; }
109 FixedPoint
operator *=(double x
) { return *this *= (FixedPoint
)x
; }
110 FixedPoint
operator *=(int x
) { return *this *= (FixedPoint
)x
; }
111 FixedPoint
operator *=(long x
) { return *this *= (FixedPoint
)x
; }
113 FixedPoint
operator /(FixedPoint x
) { return make(div(val
, x
.val
)); }
114 FixedPoint
operator /(double x
) { return *this / (FixedPoint
)x
; }
115 FixedPoint
operator /(int x
) { return *this / (FixedPoint
)x
; }
116 FixedPoint
operator /(long x
) { return *this / (FixedPoint
)x
; }
118 FixedPoint
operator /=(FixedPoint x
) { val
= div(val
, x
.val
); return *this; }
119 FixedPoint
operator /=(double x
) { return *this /= (FixedPoint
)x
; }
120 FixedPoint
operator /=(int x
) { return *this /= (FixedPoint
)x
; }
121 FixedPoint
operator /=(long x
) { return *this /= (FixedPoint
)x
; }
123 static FixedPoint
abs(FixedPoint x
) { return make(::abs(x
.val
)); }
125 static int floor(FixedPoint x
) { return x
.val
>> fixptShift
; }
127 static int ceil(FixedPoint x
)
128 { return (x
.val
& fixptMaskL
) ? ((x
.val
>> fixptShift
) + 1)
129 : (x
.val
>> fixptShift
); }
131 static int round(FixedPoint x
)
132 { return (x
.val
+ (1 << (fixptShift
- 1))) >> fixptShift
; }
134 static FixedPoint
sqrt(FixedPoint x
);
136 static FixedPoint
pow(FixedPoint x
, FixedPoint y
);
140 static FixedPoint
make(int valA
) { FixedPoint x
; x
.val
= valA
; return x
; }
142 static int mul(int x
, int y
);
143 static int div(int x
, int y
);
145 int val
; // 16.16 fixed point
148 #endif // USE_FIXEDPOINT