1 //========================================================================
5 // Fixed point type, with C++ operators.
7 // Copyright 2004 Glyph & Cog, LLC
9 //========================================================================
15 #ifdef USE_GCC_PRAGMAS
16 #pragma implementation
19 #include "FixedPoint.h"
21 #define ln2 ((FixedPoint)0.69314718)
23 #define ln2 ((FixedPoint)0.69314718)
25 FixedPoint
FixedPoint::sqrt(FixedPoint x
) {
31 y1
.val
= x
.val
== 1 ? 2 : x
.val
>> 1;
35 y1
.val
= (y0
.val
+ z
.val
) >> 1;
36 } while (::abs(y0
.val
- y1
.val
) > 1);
41 FixedPoint
FixedPoint::pow(FixedPoint x
, FixedPoint y
) {
42 FixedPoint t
, t2
, lnx0
, lnx
, z0
, z
;
49 t
= (x
- 1) / (x
+ 1);
58 } while (::abs(lnx
.val
- lnx0
.val
) > 2);
74 } while (::abs(z
.val
- z0
.val
) > 2 && d
< (1 << fixptShift
));
84 int FixedPoint::mul(int x
, int y
) {
87 z
= ((FixPtInt64
)x
* y
) >> fixptShift
;
88 if (z
> 0x7fffffffLL
) {
90 } else if (z
< -0x80000000LL
) {
97 int FixedPoint::div(int x
, int y
) {
100 z
= ((FixPtInt64
)x
<< fixptShift
) / y
;
101 if (z
> 0x7fffffffLL
) {
103 } else if (z
< -0x80000000LL
) {
110 GBool
FixedPoint::divCheck(FixedPoint x
, FixedPoint y
, FixedPoint
*result
) {
113 z
= ((FixPtInt64
)x
.val
<< fixptShift
) / y
.val
;
114 if ((z
== 0 && x
!= 0) ||
115 z
>= ((FixPtInt64
)1 << 31) || z
< -((FixPtInt64
)1 << 31)) {
122 GBool
FixedPoint::checkDet(FixedPoint m11
, FixedPoint m12
,
123 FixedPoint m21
, FixedPoint m22
,
124 FixedPoint epsilon
) {
127 det
= (FixPtInt64
)m11
.val
* (FixPtInt64
)m22
.val
128 - (FixPtInt64
)m12
.val
* (FixPtInt64
)m21
.val
;
129 e
= (FixPtInt64
)epsilon
.val
<< fixptShift
;
130 // NB: this comparison has to be >= not > because epsilon can be
131 // truncated to zero as a fixed point value.
132 return det
>= e
|| det
<= -e
;
135 #endif // USE_FIXEDPOINT