Update SConscript.
[blender-staging.git] / intern / iksolver / intern / TNT / tntmath.h
1 /**
2  * $Id$
3  */
4
5 /*
6
7 *
8 * Template Numerical Toolkit (TNT): Linear Algebra Module
9 *
10 * Mathematical and Computational Sciences Division
11 * National Institute of Technology,
12 * Gaithersburg, MD USA
13 *
14 *
15 * This software was developed at the National Institute of Standards and
16 * Technology (NIST) by employees of the Federal Government in the course
17 * of their official duties. Pursuant to title 17 Section 105 of the
18 * United States Code, this software is not subject to copyright protection
19 * and is in the public domain.  The Template Numerical Toolkit (TNT) is
20 * an experimental system.  NIST assumes no responsibility whatsoever for
21 * its use by other parties, and makes no guarantees, expressed or implied,
22 * about its quality, reliability, or any other characteristic.
23 *
24 * BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
25 * see http://math.nist.gov/tnt for latest updates.
26 *
27 */
28
29
30
31 // Header file for scalar math functions
32
33 #ifndef TNTMATH_H
34 #define TNTMATH_H
35
36 // conventional functions required by several matrix algorithms
37
38
39
40 namespace TNT 
41 {
42
43 struct TNTException {
44         int i;
45 };
46
47
48 inline double abs(double t)
49 {
50     return ( t > 0 ? t : -t);
51 }
52
53 inline double min(double a, double b)
54 {
55     return (a < b ? a : b);
56 }
57
58 inline double max(double a, double b)
59 {
60     return (a > b ? a : b);
61 }
62
63 inline float abs(float t)
64 {
65     return ( t > 0 ? t : -t);
66 }
67
68 inline float min(float a, float b)
69 {
70     return (a < b ? a : b);
71 }
72
73 inline int min(int a, int b)
74 {
75     return (a < b ? a : b);
76 }
77
78 inline int max(int a, int b)
79 {
80     return (a > b ? a : b);
81 }
82
83 inline float max(float a, float b)
84 {
85     return (a > b ? a : b);
86 }
87
88 inline double sign(double a)
89 {
90     return (a > 0 ? 1.0 : -1.0);
91 }
92
93 inline double sign(double a,double b) {
94         return (b >= 0.0 ? TNT::abs(a) : -TNT::abs(a));
95 }
96
97 inline float sign(float a,float b) {
98         return (b >= 0.0f ? TNT::abs(a) : -TNT::abs(a));
99 }
100
101 inline float sign(float a)
102 {
103     return (a > 0.0 ? 1.0f : -1.0f);
104 }
105
106 inline float pythag(float a, float b)
107 {
108         float absa,absb;
109         absa = abs(a);
110         absb = abs(b);
111
112         if (absa > absb) {
113                 float sqr = absb/absa;
114                 sqr *= sqr;
115                 return absa * float(sqrt(1 + sqr));
116         } else {
117                 if (absb > float(0)) {
118                         float sqr = absa/absb;
119                         sqr *= sqr;
120                         return absb * float(sqrt(1 + sqr));
121                 } else {
122                         return float(0);
123                 }
124         }
125 }
126
127 inline double pythag(double a, double b)
128 {
129         double absa,absb;
130         absa = abs(a);
131         absb = abs(b);
132
133         if (absa > absb) {
134                 double sqr = absb/absa;
135                 sqr *= sqr;
136                 return absa * double(sqrt(1 + sqr));
137         } else {
138
139                 if (absb > double(0)) { 
140                         double sqr = absa/absb;
141                         sqr *= sqr;
142                         return absb * double(sqrt(1 + sqr));
143                 } else {
144                         return double(0);
145                 }
146         }
147 }
148
149
150 } /* namespace TNT */
151
152 #endif /* TNTMATH_H */
153