doxygen: intern/smoke tagged.
[blender.git] / intern / smoke / intern / tnt / tnt_math_utils.h
1 /** \file smoke/intern/tnt/tnt_math_utils.h
2  *  \ingroup smoke
3  */
4 #ifndef MATH_UTILS_H
5 #define MATH_UTILS_H
6
7 /* needed for fabs, sqrt() below */
8 #include <cmath>
9
10 #ifdef _WIN32
11 #define hypot _hypot
12 #endif
13
14 namespace TNT
15 {
16 /**
17         @returns hypotenuse of real (non-complex) scalars a and b by 
18         avoiding underflow/overflow
19         using (a * sqrt( 1 + (b/a) * (b/a))), rather than
20         sqrt(a*a + b*b).
21 */
22 template <class Real>
23 Real hypot(const Real &a, const Real &b)
24 {
25         
26         if (a== 0)
27                 return fabs(b);
28         else
29         {
30                 Real c = b/a;
31                 return fabs(a) * sqrt(1 + c*c);
32         }
33 }
34 } /* TNT namespace */
35
36
37
38 #endif
39 /* MATH_UTILS_H */