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
1.5.3