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;} 
};