fixed.h

Go to the documentation of this file.
00001 //////////////////////////////////////////////////////////////////////////
00002 //
00003 //  Fixed Point Math Class
00004 //
00005 //////////////////////////////////////////////////////////////////////////
00006 //
00007 //  Released under GNU license
00008 //              Erik H Gawtry
00009 //                      July, 2005      Version 1.0
00010 //              Altered G Camp
00011 //                      Aug, 2007 Version 1.1
00012 //
00013 //
00014 //  Algorythms borrowed from:
00015 //              Andrew Ryder, 11 September 2001
00016 //      Joseph Hall, Unknown Date
00017 //
00018 //
00019 //////////////////////////////////////////////////////////////////////////
00020 //
00021 // Written for doing fixed point math on DSP processors
00022 //
00023 //////////////////////////////////////////////////////////////////////////
00024 
00025 #ifndef _FIXED_H
00026 #define _FIXED_H
00027 
00028 #define FIXED_RESOLUTION                10000
00029 #define FIXED_RESOLUTION_FLOAT  10000.0f
00030 
00031 class fixed
00032 {
00033 private:
00034         int     m_nVal;
00035 public:
00036         fixed()
00037         {
00038                 m_nVal = 0;
00039         }
00040 
00041         fixed(const fixed& fixedVal)
00042         {
00043                 m_nVal = fixedVal.m_nVal;
00044         }
00045 
00046         fixed(bool bInternal, int nVal)
00047         {
00048                 m_nVal = nVal;
00049         }
00050 
00051         fixed(unsigned int nVal)
00052         {
00053                 m_nVal = nVal*FIXED_RESOLUTION;
00054         }
00055 
00056         fixed(int nVal)
00057         {
00058                 m_nVal = nVal*FIXED_RESOLUTION;
00059         }
00060 
00061         fixed(const char *nVal);
00062 
00063         ~fixed()
00064         {
00065         }
00066 
00067         fixed operator++()
00068         {
00069                 m_nVal += FIXED_RESOLUTION;
00070                 return *this;
00071         }
00072 
00073         fixed operator--()
00074         {
00075                 m_nVal -= FIXED_RESOLUTION;
00076                 return *this;
00077         }
00078 
00079         fixed operator-()
00080         {
00081                 return fixed(0) - *this;
00082         }
00083 
00084         fixed& operator=(fixed fixedVal)
00085         {
00086                 m_nVal = fixedVal.m_nVal;
00087                 return *this;
00088         }
00089 
00090         bool operator==(fixed fixedVal)
00091         {
00092                 return (m_nVal == fixedVal.m_nVal);
00093         }
00094 
00095         bool operator!=(fixed fixedVal)
00096         {
00097                 return (m_nVal != fixedVal.m_nVal);
00098         }
00099 
00100         bool operator<(fixed fixedVal)
00101         {
00102                 return (m_nVal < fixedVal.m_nVal);
00103         }
00104 
00105         bool operator<=(fixed fixedVal)
00106         {
00107                 return (m_nVal <= fixedVal.m_nVal);
00108         }
00109 
00110         bool operator>(fixed fixedVal)
00111         {
00112                 return (m_nVal > fixedVal.m_nVal);
00113         }
00114 
00115         bool operator>=(fixed fixedVal)
00116         {
00117                 return (m_nVal >= fixedVal.m_nVal);
00118         }
00119 
00120         const char *asString();
00121 
00122         float asFloat()
00123         {
00124                 return m_nVal/FIXED_RESOLUTION_FLOAT;
00125         }
00126 
00127         int asInt()
00128         {
00129                 return (int)(m_nVal/FIXED_RESOLUTION);
00130         }
00131 
00132         int getInternal() 
00133         { 
00134                 return m_nVal; 
00135         }
00136 
00137         int     *getInternalData() 
00138         {
00139                 return &m_nVal;
00140         }
00141 
00142         fixed floor()
00143         {
00144                 return fixed(m_nVal/FIXED_RESOLUTION);
00145         }
00146 
00147         fixed ceil()
00148         {
00149                 return fixed(m_nVal/FIXED_RESOLUTION+1);
00150         }
00151 
00152         fixed operator+(fixed b)
00153         {
00154                 fixed a;
00155                 a.m_nVal = m_nVal+b.m_nVal;
00156                 return a;
00157         }
00158 
00159         fixed operator-(fixed b)
00160         {
00161                 fixed a;
00162                 a.m_nVal = m_nVal-b.m_nVal;
00163                 return a;
00164         }
00165 
00166         fixed operator*(fixed b);
00167         fixed operator/(fixed b);
00168         fixed sqrt();
00169         fixed pow(fixed fixedPower);
00170         fixed log10();
00171         fixed log();
00172         fixed exp();
00173         fixed cos();
00174         fixed sin();
00175         fixed tan();
00176         fixed acos();
00177 
00178         fixed abs()
00179         {
00180                 if (m_nVal > 0) return fixed(*this);
00181                 else return fixed(true, -m_nVal);
00182         }
00183 
00184         fixed operator%(fixed fixedVal)
00185         {
00186                 fixed a;
00187                 a.m_nVal = m_nVal%fixedVal.m_nVal;
00188                 return a;
00189         }
00190 
00191         fixed operator*=(fixed val);
00192         fixed operator/=(fixed val);
00193 
00194         fixed operator-=(fixed val)
00195         {
00196                 m_nVal -= val.m_nVal;
00197                 return *this;
00198         }
00199 
00200         fixed operator+=(fixed val)
00201         {
00202                 m_nVal += val.m_nVal;
00203                 return *this;
00204         }
00205 
00206         static fixed MAX_FIXED;
00207         static fixed XPI;
00208         static fixed X2PI;
00209         static fixed XPIO2;
00210 
00211         static fixed fromFloat(float flt);
00212 };
00213 
00214 fixed absx( fixed p_Base );
00215 fixed floorx(fixed fixedVal);
00216 fixed ceilx(fixed fixedVal);
00217 fixed sqrtx(fixed fixedVal);
00218 fixed powx(fixed fixedVal, fixed fixedPower);
00219 fixed log10x(fixed fixedVal);
00220 fixed logx(fixed fixedVal);
00221 fixed expx(fixed fixedVal);
00222 fixed sinx(fixed x);
00223 fixed cosx(fixed x);
00224 fixed tanx(fixed x);
00225 fixed atanx(fixed x);
00226 fixed atan2x(fixed x, fixed y);
00227 
00228 #endif // _FIXED_H
00229 

Generated on Mon Feb 16 15:14:48 2009 for Scorched3D by  doxygen 1.5.3