9e79c07fa673ac50f935240dccc0b9b7dd672b7f
[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     return (a < b ? a : b);
75 }
76
77
78 inline float max(float a, float b)
79 {
80     return (a > b ? a : b);
81 }
82
83 inline double sign(double a)
84 {
85     return (a > 0 ? 1.0 : -1.0);
86 }
87
88 inline double sign(double a,double b) {
89         return (b >= 0.0 ? TNT::abs(a) : -TNT::abs(a));
90 }
91
92 inline float sign(float a,float b) {
93         return (b >= 0.0f ? TNT::abs(a) : -TNT::abs(a));
94 }
95
96 inline float sign(float a)
97 {
98     return (a > 0.0 ? 1.0f : -1.0f);
99 }
100
101 inline float pythag(float a, float b)
102 {
103         float absa,absb;
104         absa = abs(a);
105         absb = abs(b);
106
107         if (absa > absb) {
108                 float sqr = absb/absa;
109                 sqr *= sqr;
110                 return absa * float(sqrt(1 + sqr));
111         } else {
112                 if (absb > float(0)) {
113                         float sqr = absa/absb;
114                         sqr *= sqr;
115                         return absb * float(sqrt(1 + sqr));
116                 } else {
117                         return float(0);
118                 }
119         }
120 }
121
122 inline double pythag(double a, double b)
123 {
124         double absa,absb;
125         absa = abs(a);
126         absb = abs(b);
127
128         if (absa > absb) {
129                 double sqr = absb/absa;
130                 sqr *= sqr;
131                 return absa * double(sqrt(1 + sqr));
132         } else {
133
134                 if (absb > double(0)) { 
135                         double sqr = absa/absb;
136                         sqr *= sqr;
137                         return absb * double(sqrt(1 + sqr));
138                 } else {
139                         return double(0);
140                 }
141         }
142 }
143
144
145 } /* namespace TNT */
146
147 #endif /* TNTMATH_H */
148