fixed spacing in the headers to get rid of some warnings and some other
[blender.git] / intern / iksolver / intern / TNT / tntmath.h
1 /**
2  * $Id$
3  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version. The Blender
9  * Foundation also sells licenses for use in proprietary software under
10  * the Blender License.  See http://www.blender.org/BL/ for information
11  * about this.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
21  *
22  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL/BL DUAL LICENSE BLOCK *****
30  */
31
32 /*
33
34 *
35 * Template Numerical Toolkit (TNT): Linear Algebra Module
36 *
37 * Mathematical and Computational Sciences Division
38 * National Institute of Technology,
39 * Gaithersburg, MD USA
40 *
41 *
42 * This software was developed at the National Institute of Standards and
43 * Technology (NIST) by employees of the Federal Government in the course
44 * of their official duties. Pursuant to title 17 Section 105 of the
45 * United States Code, this software is not subject to copyright protection
46 * and is in the public domain.  The Template Numerical Toolkit (TNT) is
47 * an experimental system.  NIST assumes no responsibility whatsoever for
48 * its use by other parties, and makes no guarantees, expressed or implied,
49 * about its quality, reliability, or any other characteristic.
50 *
51 * BETA VERSION INCOMPLETE AND SUBJECT TO CHANGE
52 * see http://math.nist.gov/tnt for latest updates.
53 *
54 */
55
56
57
58 // Header file for scalar math functions
59
60 #ifndef TNTMATH_H
61 #define TNTMATH_H
62
63 // conventional functions required by several matrix algorithms
64
65
66
67 namespace TNT 
68 {
69
70 struct TNTException {
71         int i;
72 };
73
74
75 inline double abs(double t)
76 {
77     return ( t > 0 ? t : -t);
78 }
79
80 inline double min(double a, double b)
81 {
82     return (a < b ? a : b);
83 }
84
85 inline double max(double a, double b)
86 {
87     return (a > b ? a : b);
88 }
89
90 inline float abs(float t)
91 {
92     return ( t > 0 ? t : -t);
93 }
94
95 inline float min(float a, float b)
96 {
97     return (a < b ? a : b);
98 }
99
100 inline int min(int a,int b) {
101     return (a < b ? a : b);
102 }
103
104
105 inline float max(float a, float b)
106 {
107     return (a > b ? a : b);
108 }
109
110 inline double sign(double a)
111 {
112     return (a > 0 ? 1.0 : -1.0);
113 }
114
115 inline double sign(double a,double b) {
116         return (b >= 0.0 ? TNT::abs(a) : -TNT::abs(a));
117 }
118
119 inline float sign(float a,float b) {
120         return (b >= 0.0f ? TNT::abs(a) : -TNT::abs(a));
121 }
122
123 inline float sign(float a)
124 {
125     return (a > 0.0 ? 1.0f : -1.0f);
126 }
127
128 inline float pythag(float a, float b)
129 {
130         float absa,absb;
131         absa = abs(a);
132         absb = abs(b);
133
134         if (absa > absb) {
135                 float sqr = absb/absa;
136                 sqr *= sqr;
137                 return absa * float(sqrt(1 + sqr));
138         } else {
139                 if (absb > float(0)) {
140                         float sqr = absa/absb;
141                         sqr *= sqr;
142                         return absb * float(sqrt(1 + sqr));
143                 } else {
144                         return float(0);
145                 }
146         }
147 }
148
149 inline double pythag(double a, double b)
150 {
151         double absa,absb;
152         absa = abs(a);
153         absb = abs(b);
154
155         if (absa > absb) {
156                 double sqr = absb/absa;
157                 sqr *= sqr;
158                 return absa * double(sqrt(1 + sqr));
159         } else {
160
161                 if (absb > double(0)) { 
162                         double sqr = absa/absb;
163                         sqr *= sqr;
164                         return absb * double(sqrt(1 + sqr));
165                 } else {
166                         return double(0);
167                 }
168         }
169 }
170
171
172 } /* namespace TNT */
173
174 #endif /* TNTMATH_H */
175