artkpFloat_float.h
Go to the documentation of this file.
1 /* ========================================================================
2  * PROJECT: ARToolKitPlus
3  * ========================================================================
4  * This work is based on the original ARToolKit developed by
5  * Hirokazu Kato
6  * Mark Billinghurst
7  * HITLab, University of Washington, Seattle
8  * http://www.hitl.washington.edu/artoolkit/
9  *
10  * Copyright of the derived and new portions of this work
11  * (C) 2006 Graz University of Technology
12  *
13  * This framework is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * This framework is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this framework; if not, write to the Free Software
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26  *
27  * For further information please contact
28  * Dieter Schmalstieg
29  * <schmalstieg@icg.tu-graz.ac.at>
30  * Graz University of Technology,
31  * Institut for Computer Graphics and Vision,
32  * Inffeldgasse 16a, 8010 Graz, Austria.
33  * ========================================================================
34  ** @author Daniel Wagner
35  *
36  * $Id$
37  * @file
38  * ======================================================================== */
39 
40 
41 #ifndef __ARTKPFLOAT_FLOAT_HEADERFILE__
42 #define __ARTKPFLOAT_FLOAT_HEADERFILE__
43 
44 #include <math.h>
45 
46 
47 // Floating point implementation of artkpFloat
48 // Although this class will be very slow on any hardware
49 // without an FPU the advantage is high precision.
50 //
51 template <typename BASETYPE_>
53 {
54 public:
55  typedef BASETYPE_ BASETYPE;
56 
58  artkpFloat_float(int nV) { setInt(nV); }
59  artkpFloat_float(unsigned int nV) { setUnsignedInt(nV); }
60  artkpFloat_float(float nV) { setFloat(nV); }
61  artkpFloat_float(double nV) { setDouble(nV); }
62  artkpFloat_float(const artkpFloat_float& nOther) { v = nOther.v; }
63 
64  // custom interface
65  //
66  bool isFixed() { return false; };
67 
68  void setFixed(int nV) { v = nV/65536.0f; }
69  void setInt(int nV) { v = (BASETYPE)nV; }
70  void setUnsignedInt(int nV) { v = (BASETYPE)nV; }
71  void setFloat(float nV) { v = nV; }
72  void setDouble(double nV) { v = (BASETYPE)nV; }
73  void setArtkpFloat(const artkpFloat_float& nOther) { v = nOther.v; }
74 
75  int getByte() const { return (int)(v*255.0f); }
76  int getFixed() const { return (int)(v*65536.0f); }
77  int getInt() const { return (int)v; }
78  float getFloat() const { return (float)v; }
79  double getDouble() const { return (double)v; }
80 
81  operator double() const { return getDouble(); }
82 
83  void inverse(const artkpFloat_float& nOther) { v = BASETYPE(1)/nOther.v; }
84  void inverse() { v = BASETYPE(1)/v; }
85 
86  void inverseSqrt(const artkpFloat_float& nOther) { v = BASETYPE(1)/(BASETYPE)sqrt(nOther.v); }
87  void inverseSqrt() { v = BASETYPE(1)/(BASETYPE)sqrt(v); }
88 
89  void multiplyBy255() { v *= 255.0f; }
90 
91 
92  // some standard math.h routines applied to this class
93  //
94  friend inline const artkpFloat_float sqrt(const artkpFloat_float& nV)
95  { return ::sqrt(nV.v); }
96  friend inline const artkpFloat_float cos(const artkpFloat_float& nV)
97  { return ::cos(nV.v); }
98  friend inline const artkpFloat_float sin(const artkpFloat_float& nV)
99  { return ::sin(nV.v); }
100  friend inline const artkpFloat_float acos(const artkpFloat_float& nV)
101  { return ::acos(nV.v); }
102  friend inline const artkpFloat_float asin(const artkpFloat_float& nV)
103  { return ::asin(nV.v); }
104  friend inline const artkpFloat_float atan2(const artkpFloat_float& nVa, const artkpFloat_float& nVb)
105  { return ::atan2(nVa.v,nVb.v); }
106  friend inline const artkpFloat_float fabs(const artkpFloat_float& nV)
107  { return ::fabs(nV.v); }
108  friend inline const artkpFloat_float pow(const artkpFloat_float& nVa, const artkpFloat_float& nVb)
109  { return ::pow(nVa.v,nVb.v); }
110  friend inline const artkpFloat_float ceil(const artkpFloat_float& nV)
111  { return ::ceil(nV.v); }
112 
113  // overloaded operators
114  //
115  artkpFloat_float& operator=(unsigned int nV) { setInt(nV); return *this; }
116  artkpFloat_float& operator=(int nV) { setInt(nV); return *this; }
117  artkpFloat_float& operator=(float nV) { setFloat(nV); return *this; }
118  artkpFloat_float& operator=(double nV) { setDouble(nV); return *this; }
119  artkpFloat_float& operator=(const artkpFloat_float& nOther) { v = nOther.v; return *this; }
120 
121  artkpFloat_float operator-() const { artkpFloat_float w; w.v = -v; return w; }
122 
123  artkpFloat_float& operator+=(int nV) { v+=(BASETYPE)nV; return *this; }
124  artkpFloat_float& operator-=(int nV) { v-=(BASETYPE)nV; return *this; }
125  artkpFloat_float& operator*=(int nV) { v*=(BASETYPE)nV; return *this; }
126  artkpFloat_float& operator/=(int nV) { v/=(BASETYPE)nV; return *this; }
127 
128  artkpFloat_float& operator+=(float nV) { v+=nV; return *this; }
129  artkpFloat_float& operator-=(float nV) { v-=nV; return *this; }
130  artkpFloat_float& operator*=(float nV) { v*=nV; return *this; }
131  artkpFloat_float& operator/=(float nV) { v/=nV; return *this; }
132 
133  artkpFloat_float& operator+=(double nV) { v+=(BASETYPE)nV; return *this; }
134  artkpFloat_float& operator-=(double nV) { v-=(BASETYPE)nV; return *this; }
135  artkpFloat_float& operator*=(double nV) { v*=(BASETYPE)nV; return *this; }
136  artkpFloat_float& operator/=(double nV) { v/=(BASETYPE)nV; return *this; }
137 
138  artkpFloat_float& operator+=(const artkpFloat_float& nOther) { v+=nOther.v; return *this; }
139  artkpFloat_float& operator-=(const artkpFloat_float& nOther) { v-=nOther.v; return *this; }
140  artkpFloat_float& operator*=(const artkpFloat_float& nOther) { v*=nOther.v; return *this; }
141  artkpFloat_float& operator/=(const artkpFloat_float& nOther) { v/=nOther.v; return *this; }
142 
143  artkpFloat_float& operator>>=(int nBits) { int tmp=1<<nBits; v/=tmp; return *this; }
144  artkpFloat_float& operator<<=(int nBits) { int tmp=1<<nBits; v*=tmp; return *this; }
145 
146  bool operator==(const artkpFloat_float& nOther) const { return v==nOther.v; }
147  bool operator!=(const artkpFloat_float& nOther) const { return v!=nOther.v; }
148  bool operator<=(const artkpFloat_float& nOther) const { return v<=nOther.v; }
149  bool operator>=(const artkpFloat_float& nOther) const { return v>=nOther.v; }
150  bool operator<(const artkpFloat_float& nOther) const { return v<nOther.v; }
151  bool operator>(const artkpFloat_float& nOther) const { return v>nOther.v; }
152 
153  bool operator==(int nOther) const { return v==(BASETYPE)nOther; }
154  bool operator!=(int nOther) const { return v!=(BASETYPE)nOther; }
155  bool operator<=(int nOther) const { return v<=(BASETYPE)nOther; }
156  bool operator>=(int nOther) const { return v>=(BASETYPE)nOther; }
157  bool operator<(int nOther) const { return v< (BASETYPE)nOther; }
158  bool operator>(int nOther) const { return v> (BASETYPE)nOther; }
159 
160  bool operator==(float nOther) const { return v==nOther; }
161  bool operator!=(float nOther) const { return v!=nOther; }
162  bool operator<=(float nOther) const { return v<=nOther; }
163  bool operator>=(float nOther) const { return v>=nOther; }
164  bool operator<(float nOther) const { return v<nOther; }
165  bool operator>(float nOther) const { return v>nOther; }
166 
167  friend inline const artkpFloat_float operator+(const artkpFloat_float& left, const artkpFloat_float& right)
168  { return left.v+right.v; }
169  friend inline const artkpFloat_float operator+(const artkpFloat_float& left, float right)
170  { return left.v+right; }
171  friend inline const artkpFloat_float operator+(float left, const artkpFloat_float& right)
172  { return left+right.v; }
173 
174  friend inline const artkpFloat_float operator-(const artkpFloat_float& left, const artkpFloat_float& right)
175  { return left.v-right.v; }
176  friend inline const artkpFloat_float operator-(const artkpFloat_float& left, float right)
177  { return left.v-right; }
178  friend inline const artkpFloat_float operator-(float left, const artkpFloat_float& right)
179  { return left-right.v; }
180 
181  friend inline const artkpFloat_float operator*(const artkpFloat_float& left, const artkpFloat_float& right)
182  { return left.v*right.v; }
183  friend inline const artkpFloat_float operator*(const artkpFloat_float& left, float right)
184  { return left.v*right; }
185  friend inline const artkpFloat_float operator*(float left, const artkpFloat_float& right)
186  { return left*right.v; }
187 
188  friend inline const artkpFloat_float operator/(const artkpFloat_float& left, const artkpFloat_float& right)
189  { return left.v/right.v; }
190  friend inline const artkpFloat_float operator/(const artkpFloat_float& left, float right)
191  { return left.v/right; }
192  friend inline const artkpFloat_float operator/(float left, const artkpFloat_float& right)
193  { return left/right.v; }
194 
195 protected:
196  BASETYPE v;
197 };
198 
199 
200 /*
201 // binary operator +
202 //
203 template <typename BT>
204 inline const artkpFloat_float<typename BT>
205 operator+(const artkpFloat_float<typename BT>& left, const artkpFloat_float<typename BT>& right)
206 {
207  return artkpFloat_float<BT>(left.v+right.v);
208 }
209 
210 template <typename BT>
211 inline const artkpFloat_float<typename BT>
212 operator+(const artkpFloat_float<typename BT>& left, float right)
213 {
214  return artkpFloat_float<BT>(left.v+right);
215 }
216 
217 template <typename BT>
218 inline const artkpFloat_float<typename BT>
219 operator+(float left, const artkpFloat_float<typename BT>& right)
220 {
221  return artkpFloat_float<BT>(left+right.v);
222 }
223 
224 
225 
226 // binary operator -
227 //
228 template <typename BT>
229 inline const artkpFloat_float<typename BT>
230 operator-(const artkpFloat_float<typename BT>& left, const artkpFloat_float<typename BT>& right)
231 {
232  return artkpFloat_float<BT>(left.v-right.v);
233 }
234 
235 template <typename BT>
236 inline const artkpFloat_float<typename BT>
237 operator-(const artkpFloat_float<typename BT>& left, float right)
238 {
239  return artkpFloat_float<BT>(left.v-right);
240 }
241 
242 template <typename BT>
243 inline const artkpFloat_float<typename BT>
244 operator-(float left, const artkpFloat_float<typename BT>& right)
245 {
246  return artkpFloat_float<BT>(left-right.v);
247 }
248 
249 
250 // binary operator *
251 //
252 template <typename BT>
253 inline const artkpFloat_float<typename BT>
254 operator*(const artkpFloat_float<typename BT>& left, const artkpFloat_float<typename BT>& right)
255 {
256  return artkpFloat_float<BT>(left.v*right.v);
257 }
258 
259 template <typename BT>
260 inline const artkpFloat_float<typename BT>
261 operator*(const artkpFloat_float<typename BT>& left, float right)
262 {
263  return artkpFloat_float<BT>(left.v*right);
264 }
265 
266 template <typename BT>
267 inline const artkpFloat_float<typename BT>
268 operator*(float left, const artkpFloat_float<typename BT>& right)
269 {
270  return artkpFloat_float<BT>(left*right.v);
271 }
272 
273 
274 // binary operator /
275 //
276 template <typename BT>
277 inline const artkpFloat_float<typename BT>
278 operator/(const artkpFloat_float<typename BT>& left, const artkpFloat_float<typename BT>& right)
279 {
280  return artkpFloat_float<BT>(left.v/right.v);
281 }
282 
283 
284 template <typename BT>
285 inline const artkpFloat_float<typename BT>
286 operator/(const artkpFloat_float<typename BT>& left, float right)
287 {
288  return artkpFloat_float<BT>(left.v/right);
289 }
290 
291 template <typename BT>
292 inline const artkpFloat_float<typename BT>
293 operator/(float left, const artkpFloat_float<typename BT>& right)
294 {
295  return artkpFloat_float<BT>(left/right.v);
296 }
297 */
298 
299 
300 /*
301 // math.h methods
302 //
303 template <typename BT>
304 inline const artkpFloat_float<typename BT>
305 cos(const artkpFloat_float<typename BT>& nV)
306 {
307  return artkpFloat_float<BT>(::cos(nV.v));
308 }
309 
310 
311 template <typename BT>
312 inline const artkpFloat_float<typename BT>
313 sin(const artkpFloat_float<typename BT>& nV)
314 {
315  return artkpFloat_float<BT>(::sin(nV.v));
316 }
317 
318 template <typename BT>
319 inline const artkpFloat_float<typename BT>
320 acos(const artkpFloat_float<typename BT>& nV)
321 {
322  return artkpFloat_float<BT>(::acos(nV.v));
323 }
324 
325 template <typename BT>
326 inline const artkpFloat_float<typename BT>
327 asin(const artkpFloat_float<typename BT>& nV)
328 {
329  return artkpFloat_float<BT>(::asin(nV.v));
330 }
331 
332 template <typename BT>
333 inline const artkpFloat_float<typename BT>
334 atan2(const artkpFloat_float<typename BT>& nVa, const artkpFloat_float<typename BT>& nVb)
335 {
336  return artkpFloat_float<BT>(::atan2(nVa.v, nVb.v));
337 }
338 
339 template <typename BT>
340 inline const artkpFloat_float<typename BT>
341 fabs(const artkpFloat_float<typename BT>& nV)
342 {
343  return artkpFloat_float<BT>(::fabs(nV.v));
344 }
345 
346 template <typename BT>
347 inline const artkpFloat_float<typename BT>
348 pow(const artkpFloat_float<typename BT>& nVa, const artkpFloat_float<typename BT>& nVb)
349 {
350  return artkpFloat_float<BT>(::pow(nVa.v, nVb.v));
351 }
352 
353 template <typename BT>
354 inline const artkpFloat_float<typename BT>
355 sqrt(const artkpFloat_float<typename BT>& nV)
356 {
357  return artkpFloat_float<BT>(::sqrt(nV.v));
358 }
359 
360 template <typename BT>
361 inline const artkpFloat_float<typename BT>
362 ceil(const artkpFloat_float<typename BT>& nV)
363 {
364  return artkpFloat_float<BT>(::ceil(nV.v));
365 }
366 */
367 
368 #endif //__ARTKPFLOAT_FLOAT_HEADERFILE__
artkpFloat_float & operator=(const artkpFloat_float &nOther)
friend const artkpFloat_float operator*(const artkpFloat_float &left, float right)
bool operator==(int nOther) const
bool operator<(float nOther) const
artkpFloat_float & operator>>=(int nBits)
bool operator<=(const artkpFloat_float &nOther) const
bool operator<=(int nOther) const
artkpFloat_float & operator+=(int nV)
friend const artkpFloat_float fabs(const artkpFloat_float &nV)
friend const artkpFloat_float operator-(const artkpFloat_float &left, float right)
friend const artkpFloat_float sin(const artkpFloat_float &nV)
artkpFloat_float & operator-=(double nV)
artkpFloat_float & operator-=(int nV)
friend const artkpFloat_float cos(const artkpFloat_float &nV)
artkpFloat_float & operator-=(const artkpFloat_float &nOther)
artkpFloat_float(double nV)
bool operator<(int nOther) const
friend const artkpFloat_float pow(const artkpFloat_float &nVa, const artkpFloat_float &nVb)
bool operator>(float nOther) const
artkpFloat_float operator-() const
bool operator>=(float nOther) const
bool operator<=(float nOther) const
artkpFloat_float & operator=(int nV)
bool operator<(const artkpFloat_float &nOther) const
bool operator!=(float nOther) const
artkpFloat_float & operator<<=(int nBits)
friend const artkpFloat_float asin(const artkpFloat_float &nV)
void setUnsignedInt(int nV)
double getDouble() const
friend const artkpFloat_float operator+(float left, const artkpFloat_float &right)
void setArtkpFloat(const artkpFloat_float &nOther)
friend const artkpFloat_float operator-(float left, const artkpFloat_float &right)
artkpFloat_float & operator+=(double nV)
bool operator!=(const artkpFloat_float &nOther) const
artkpFloat_float & operator+=(const artkpFloat_float &nOther)
artkpFloat_float & operator+=(float nV)
artkpFloat_float(float nV)
artkpFloat_float & operator/=(float nV)
bool operator>=(int nOther) const
void inverseSqrt(const artkpFloat_float &nOther)
friend const artkpFloat_float sqrt(const artkpFloat_float &nV)
bool operator>(const artkpFloat_float &nOther) const
artkpFloat_float & operator-=(float nV)
friend const artkpFloat_float operator/(float left, const artkpFloat_float &right)
friend const artkpFloat_float operator+(const artkpFloat_float &left, float right)
artkpFloat_float & operator=(double nV)
float getFloat() const
int getInt() const
bool operator>=(const artkpFloat_float &nOther) const
void setFloat(float nV)
friend const artkpFloat_float operator-(const artkpFloat_float &left, const artkpFloat_float &right)
artkpFloat_float & operator*=(double nV)
void setDouble(double nV)
artkpFloat_float & operator*=(float nV)
artkpFloat_float & operator*=(const artkpFloat_float &nOther)
TFSIMD_FORCE_INLINE const tfScalar & w() const
bool operator==(const artkpFloat_float &nOther) const
artkpFloat_float & operator/=(double nV)
void inverse(const artkpFloat_float &nOther)
bool operator!=(int nOther) const
friend const artkpFloat_float ceil(const artkpFloat_float &nV)
friend const artkpFloat_float operator/(const artkpFloat_float &left, const artkpFloat_float &right)
bool operator==(float nOther) const
artkpFloat_float & operator/=(int nV)
bool operator>(int nOther) const
artkpFloat_float & operator*=(int nV)
int getFixed() const
void setFixed(int nV)
artkpFloat_float(const artkpFloat_float &nOther)
friend const artkpFloat_float operator*(const artkpFloat_float &left, const artkpFloat_float &right)
friend const artkpFloat_float operator+(const artkpFloat_float &left, const artkpFloat_float &right)
artkpFloat_float & operator/=(const artkpFloat_float &nOther)
void setInt(int nV)
artkpFloat_float(unsigned int nV)
friend const artkpFloat_float operator*(float left, const artkpFloat_float &right)
friend const artkpFloat_float acos(const artkpFloat_float &nV)
int getByte() const
artkpFloat_float & operator=(unsigned int nV)
friend const artkpFloat_float atan2(const artkpFloat_float &nVa, const artkpFloat_float &nVb)
friend const artkpFloat_float operator/(const artkpFloat_float &left, float right)
artkpFloat_float & operator=(float nV)


tuw_artoolkitplus
Author(s): Markus Bader
autogenerated on Sun Sep 4 2016 03:24:33