FIXED.H

/************************************************************************** 

Fixed.h - 16.16 Fixed point class

**************************************************************************/

inline long fixed_mul(long a, long b) {return MulDiv(a, b, 65536);}
inline long fixed_div(long a, long b) {return MulDiv(a, 65536, b);}

class Fixed {
private:
long fx;
public:
Fixed() {}
~Fixed() {}

Fixed(long l) {fx = l<<16;}
Fixed(int i) {fx = (long)i<<16;}
Fixed(double d) {fx = (long)(d * 65536.0);}

int Int() {return (int)(fx >> 16);}
int Frac() {return (int)(fx & 0xFFFF);}

operator int() {return (int)(fx >> 16);}
operator double() {return (double)fx / 65536.0;}

Fixed operator +(Fixed a) {Fixed c; c.fx = fx + a.fx; return c;}
Fixed operator -(Fixed a) {Fixed c; c.fx = fx - a.fx; return c;}
Fixed operator *(Fixed a) {Fixed c; c.fx = fixed_mul(fx,a.fx); return c;}
Fixed operator /(Fixed a) {Fixed c; c.fx = fixed_div(fx,a.fx); return c;}

int operator <(Fixed a) {return fx < a.fx;}
int operator >(Fixed a) {return fx > a.fx;}
int operator ==(Fixed a) {return fx == a.fx;}
int operator !=(Fixed a) {return fx != a.fx;}

// Fixed& operator =(Fixed a) {fx = a.fx; return *this;}
Fixed& operator +=(Fixed a) {fx += a.fx; return *this;}
Fixed& operator -=(Fixed a) {fx -= a.fx; return *this;}
Fixed& operator *=(Fixed a) {fx = fixed_mul(fx,a.fx); return *this;}
Fixed& operator /=(Fixed a) {fx = fixed_div(fx,a.fx); return *this;}
};