3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2004, 2007 Gerard Jungman, Brian Gough
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #ifndef __GSL_MATH_H__
21 #define __GSL_MATH_H__
23 #include <gsl/gsl_sys.h>
24 #include <gsl/gsl_machine.h>
25 #include <gsl/gsl_precision.h>
26 #include <gsl/gsl_nan.h>
27 #include <gsl/gsl_pow_int.h>
30 #define M_E 2.71828182845904523536028747135 /* e */
34 #define M_LOG2E 1.44269504088896340735992468100 /* log_2 (e) */
38 #define M_LOG10E 0.43429448190325182765112891892 /* log_10 (e) */
42 #define M_SQRT2 1.41421356237309504880168872421 /* sqrt(2) */
46 #define M_SQRT1_2 0.70710678118654752440084436210 /* sqrt(1/2) */
51 #define M_SQRT3 1.73205080756887729352744634151 /* sqrt(3) */
55 #define M_PI 3.14159265358979323846264338328 /* pi */
59 #define M_PI_2 1.57079632679489661923132169164 /* pi/2 */
63 #define M_PI_4 0.78539816339744830961566084582 /* pi/4 */
67 #define M_SQRTPI 1.77245385090551602729816748334 /* sqrt(pi) */
71 #define M_2_SQRTPI 1.12837916709551257389615890312 /* 2/sqrt(pi) */
75 #define M_1_PI 0.31830988618379067153776752675 /* 1/pi */
79 #define M_2_PI 0.63661977236758134307553505349 /* 2/pi */
83 #define M_LN10 2.30258509299404568401799145468 /* ln(10) */
87 #define M_LN2 0.69314718055994530941723212146 /* ln(2) */
91 #define M_LNPI 1.14472988584940017414342735135 /* ln(pi) */
95 #define M_EULER 0.57721566490153286060651209008 /* Euler constant */
101 # define __BEGIN_DECLS extern "C" {
102 # define __END_DECLS }
104 # define __BEGIN_DECLS /* empty */
105 # define __END_DECLS /* empty */
110 /* other needlessly compulsive abstractions */
112 #define GSL_IS_ODD(n) ((n) & 1)
113 #define GSL_IS_EVEN(n) (!(GSL_IS_ODD(n)))
114 #define GSL_SIGN(x) ((x) >= 0.0 ? 1 : -1)
116 /* Return nonzero if x is a real number, i.e. non NaN or infinite. */
117 #define GSL_IS_REAL(x) (gsl_finite(x))
119 /* Define MAX and MIN macros/functions if they don't exist. */
121 /* plain old macros for general use */
122 #define GSL_MAX(a,b) ((a) > (b) ? (a) : (b))
123 #define GSL_MIN(a,b) ((a) < (b) ? (a) : (b))
125 /* function versions of the above, in case they are needed */
126 double gsl_max (double a, double b);
127 double gsl_min (double a, double b);
129 /* inline-friendly strongly typed versions */
132 extern inline int GSL_MAX_INT (int a, int b);
133 extern inline int GSL_MIN_INT (int a, int b);
134 extern inline double GSL_MAX_DBL (double a, double b);
135 extern inline double GSL_MIN_DBL (double a, double b);
136 extern inline long double GSL_MAX_LDBL (long double a, long double b);
137 extern inline long double GSL_MIN_LDBL (long double a, long double b);
140 GSL_MAX_INT (int a, int b)
142 return GSL_MAX (a, b);
146 GSL_MIN_INT (int a, int b)
148 return GSL_MIN (a, b);
152 GSL_MAX_DBL (double a, double b)
154 return GSL_MAX (a, b);
158 GSL_MIN_DBL (double a, double b)
160 return GSL_MIN (a, b);
163 extern inline long double
164 GSL_MAX_LDBL (long double a, long double b)
166 return GSL_MAX (a, b);
169 extern inline long double
170 GSL_MIN_LDBL (long double a, long double b)
172 return GSL_MIN (a, b);
175 #define GSL_MAX_INT(a,b) GSL_MAX(a,b)
176 #define GSL_MIN_INT(a,b) GSL_MIN(a,b)
177 #define GSL_MAX_DBL(a,b) GSL_MAX(a,b)
178 #define GSL_MIN_DBL(a,b) GSL_MIN(a,b)
179 #define GSL_MAX_LDBL(a,b) GSL_MAX(a,b)
180 #define GSL_MIN_LDBL(a,b) GSL_MIN(a,b)
181 #endif /* HAVE_INLINE */
183 /* Definition of an arbitrary function with parameters */
185 struct gsl_function_struct
187 double (* function) (double x, void * params);
191 typedef struct gsl_function_struct gsl_function ;
193 #define GSL_FN_EVAL(F,x) (*((F)->function))(x,(F)->params)
195 /* Definition of an arbitrary function returning two values, r1, r2 */
197 struct gsl_function_fdf_struct
199 double (* f) (double x, void * params);
200 double (* df) (double x, void * params);
201 void (* fdf) (double x, void * params, double * f, double * df);
205 typedef struct gsl_function_fdf_struct gsl_function_fdf ;
207 #define GSL_FN_FDF_EVAL_F(FDF,x) (*((FDF)->f))(x,(FDF)->params)
208 #define GSL_FN_FDF_EVAL_DF(FDF,x) (*((FDF)->df))(x,(FDF)->params)
209 #define GSL_FN_FDF_EVAL_F_DF(FDF,x,y,dy) (*((FDF)->fdf))(x,(FDF)->params,(y),(dy))
212 /* Definition of an arbitrary vector-valued function with parameters */
214 struct gsl_function_vec_struct
216 int (* function) (double x, double y[], void * params);
220 typedef struct gsl_function_vec_struct gsl_function_vec ;
222 #define GSL_FN_VEC_EVAL(F,x,y) (*((F)->function))(x,y,(F)->params)
226 #endif /* __GSL_MATH_H__ */