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) {
86
return ((FixPtInt64)x * y) >> fixptShift;
88
int ah0, ah, bh, al, bl;
93
bl = y - (bh << fixptShift);
94
return ah0 * bh + ah * bl + al * bh + ((al * bl) >> fixptShift);
98
int FixedPoint::div(int x, int y) {
100
return ((FixPtInt64)x << fixptShift) / y;
105
GBool FixedPoint::divCheck(FixedPoint x, FixedPoint y, FixedPoint *result) {
109
z = ((FixPtInt64)x.val << fixptShift) / y.val;
110
if ((z == 0 && x != 0) ||
111
z >= ((FixPtInt64)1 << 31) || z < -((FixPtInt64)1 << 31)) {
120
#endif // USE_FIXEDPOINT