1 // Copyright 2003 "Gilles Degottex" 2 3 // This file is part of "CppAddons" 4 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. 9 // 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. 14 // 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 18 19 20 #ifndef _Math_h_ 21 #define _Math_h_ 22 23 #include <math.h> 24 #include <cmath> 25 #include <complex> 26 using namespace std; 27 28 #undef min 29 #undef max 30 31 namespace Math 32 { sgn(TypeData a)33 template<typename TypeData> inline TypeData sgn(TypeData a) {return (a<0)?-1:1;} 34 35 extern const double Pi; 36 extern const double Pi2; 37 extern const float fPi; 38 39 extern const double E; 40 extern const float fE; 41 42 // résoud une equation du 2ème degré 43 class SolOfEq2 44 { 45 public: 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}; 47 48 private: 49 ENError m_err; 50 51 double x1; 52 double x2; 53 54 public: getX1()55 double getX1(){return x1;} getX2()56 double getX2(){return x2;} 57 double getPosSol(); 58 59 SolOfEq2(double a, double b, double c); 60 }; 61 62 // calcul l'intérale de f sur [a;b] avec un pas de h 63 // méhode de Simpson 64 template<class Function> Simpson(double a,double b,Function f,double h)65 double Simpson(double a, double b, Function f, double h) 66 { 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) 69 { 70 I4+=f(x4); 71 I2+=f(x2); 72 } 73 return (h/6.0)*(f(a)+4*I4+2*I2+f(b)); 74 } 75 make_complex(Type value[])76 template<typename Type> std::complex<Type> make_complex(Type value[]){return std::complex<Type>(value[0], value[1]);} 77 modulo(double d1,double d2)78 inline double modulo(double d1, double d2) 79 { 80 return d1-int(d1/d2)*d2; 81 } mod2(const double c[2])82 inline double mod2(const double c[2]) 83 { 84 return c[0]*c[0]+c[1]*c[1]; 85 } mod(const double c[2])86 inline double mod(const double c[2]) 87 { 88 return sqrt(mod2(c)); 89 } mod2(const std::complex<double> & c)90 inline double mod2(const std::complex<double>& c) 91 { 92 return c.real()*c.real()+c.imag()*c.imag(); 93 } mod(const std::complex<double> & c)94 inline double mod(const std::complex<double>& c) 95 { 96 return sqrt(mod2(c)); 97 } 98 mod_equal(double & d1,double d2)99 inline double mod_equal(double& d1, double d2) 100 { 101 return d1 -= int(d1/d2)*d2; 102 } 103 104 //! gauss fonction 105 /*! 106 * \param x \f$\in ]-\infty,\infty[\f$ 107 */ gauss(double x)108 inline double gauss(double x) 109 { 110 return exp(-Math::Pi*x*x); 111 } 112 sinc(double t)113 inline double sinc(double t) 114 { 115 if(t==0.0) return 1.0; 116 117 return sin(Math::Pi*t)/(Math::Pi*t); 118 } 119 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) 123 { 124 return (a>b)?a:b; 125 } 126 127 template<typename TypeData1, typename TypeData2> 128 TypeData1 min(const TypeData1& a, const TypeData2& b) 129 { 130 return (a<b)?a:b; 131 }*/ 132 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 135 136 } 137 138 #endif 139 140