1 // Copyright 2003 "Gilles Degottex"
3 // This file is part of "CppAddons"
5 // "CppAddons" is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation; either version 2.1 of the License, or
8 // (at your option) any later version.
10 // "CppAddons" is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with this program; if not, write to the Free Software
17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 template<typename TypeData> inline TypeData sgn(TypeData a) {return (a<0)?-1:1;}
35 static const double Pi = 2*acos(0);
36 static const double Pi2 = 2*Pi;
37 static const float fPi = 2*acos(0);
39 static const double E = exp(1);
40 static const float fE = exp(1);
42 // résoud une equation du 2ème degré
46 enum ENError{NE_OK=0, NE_DISCRIMINENT_NEG, NE_A_AND_B_EQ_ZERO, NE_RACINE_NEG, NE_X1_AND_X2_NEG, NE_X1_AND_X2_POS};
55 double getX1(){return x1;}
56 double getX2(){return x2;}
59 SolOfEq2(double a, double b, double c);
62 // calcul l'intérale de f sur [a;b] avec un pas de h
64 template<class Function>
65 double Simpson(double a, double b, Function f, double h)
67 double I4=f(a+h/2.0), I2=0;
68 for(double x4=a+(h/2.0)+h, x2=a+h; x4<b; x4+=h, x2+=h)
73 return (h/6.0)*(f(a)+4*I4+2*I2+f(b));
76 template<typename Type> std::complex<Type> make_complex(Type value[]){return std::complex<Type>(value[0], value[1]);}
78 inline double modulo(double d1, double d2)
80 return d1-int(d1/d2)*d2;
82 inline double mod2(const double c[2])
84 return c[0]*c[0]+c[1]*c[1];
86 inline double mod(const double c[2])
90 inline double mod2(const std::complex<double>& c)
92 return c.real()*c.real()+c.imag()*c.imag();
94 inline double mod(const std::complex<double>& c)
99 inline double mod_equal(double& d1, double d2)
101 return d1 -= int(d1/d2)*d2;
106 * \param x \f$\in ]-\infty,\infty[\f$
108 inline double gauss(double x)
110 return exp(-Math::Pi*x*x);
113 inline double sinc(double t)
115 if(t==0.0) return 1.0;
117 return sin(Math::Pi*t)/(Math::Pi*t);
120 /* doesn't need for Linux for sure, seems to be probelatic under win32 (macro ambiquity)
121 template<typename TypeData1, typename TypeData2>
122 TypeData1 max(const TypeData1& a, const TypeData2& b)
127 template<typename TypeData1, typename TypeData2>
128 TypeData1 min(const TypeData1& a, const TypeData2& b)
133 // template<typename TypeData> TypeData abs(const TypeData& a) {return (a<0)?-a:a;} // include <cmath> instead
134 // template<typename TypeData> TypeData abs(TypeData a) {return (a<0)?-a:a;} // include <cmath> instead