comparison liboctave/Quad.h @ 7805:62affb34e648

Make quad work with single precision
author David Bateman <dbateman@free.fr>
date Mon, 19 May 2008 10:22:38 +0200
parents 2eb392d058bb
children eb63fbe60fab
comparison
equal deleted inserted replaced
7804:a0c550b22e61 7805:62affb34e648
25 #define octave_Quad_h 1 25 #define octave_Quad_h 1
26 26
27 #include <cfloat> 27 #include <cfloat>
28 28
29 #include "dColVector.h" 29 #include "dColVector.h"
30 #include "fColVector.h"
30 #include "lo-math.h" 31 #include "lo-math.h"
31 32
32 #if !defined (octave_Quad_typedefs) 33 #if !defined (octave_Quad_typedefs)
33 #define octave_Quad_typedefs 1 34 #define octave_Quad_typedefs 1
34 35
35 typedef double (*integrand_fcn) (double x); 36 typedef double (*integrand_fcn) (double x);
37 typedef float (*float_integrand_fcn) (float x);
36 38
37 #endif 39 #endif
38 40
39 // FIXME -- would be nice to not have to have this global 41 // FIXME -- would be nice to not have to have this global
40 // variable. 42 // variable.
51 public: 53 public:
52 54
53 Quad (integrand_fcn fcn) 55 Quad (integrand_fcn fcn)
54 : Quad_options (), f (fcn) { } 56 : Quad_options (), f (fcn) { }
55 57
58 Quad (float_integrand_fcn fcn)
59 : Quad_options (), ff (fcn) { }
60
56 virtual ~Quad (void) { } 61 virtual ~Quad (void) { }
57 62
58 virtual double integrate (void) 63 virtual double integrate (void)
59 { 64 {
60 octave_idx_type ier, neval; 65 octave_idx_type ier, neval;
61 double abserr; 66 double abserr;
62 return do_integrate (ier, neval, abserr); 67 return do_integrate (ier, neval, abserr);
63 } 68 }
64 69
70 virtual float float_integrate (void)
71 {
72 octave_idx_type ier, neval;
73 float abserr;
74 return do_integrate (ier, neval, abserr);
75 }
76
65 virtual double integrate (octave_idx_type& ier) 77 virtual double integrate (octave_idx_type& ier)
66 { 78 {
67 octave_idx_type neval; 79 octave_idx_type neval;
68 double abserr; 80 double abserr;
69 return do_integrate (ier, neval, abserr); 81 return do_integrate (ier, neval, abserr);
70 } 82 }
71 83
84 virtual float float_integrate (octave_idx_type& ier)
85 {
86 octave_idx_type neval;
87 float abserr;
88 return do_integrate (ier, neval, abserr);
89 }
90
72 virtual double integrate (octave_idx_type& ier, octave_idx_type& neval) 91 virtual double integrate (octave_idx_type& ier, octave_idx_type& neval)
73 { 92 {
74 double abserr; 93 double abserr;
75 return do_integrate (ier, neval, abserr); 94 return do_integrate (ier, neval, abserr);
76 } 95 }
77 96
97 virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval)
98 {
99 float abserr;
100 return do_integrate (ier, neval, abserr);
101 }
102
78 virtual double integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr) 103 virtual double integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr)
79 { 104 {
80 return do_integrate (ier, neval, abserr); 105 return do_integrate (ier, neval, abserr);
81 } 106 }
82 107
108 virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr)
109 {
110 return do_integrate (ier, neval, abserr);
111 }
112
83 virtual double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr) = 0; 113 virtual double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr) = 0;
84 114
115 virtual float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr) = 0;
116
85 protected: 117 protected:
86 118
87 integrand_fcn f; 119 integrand_fcn f;
120 float_integrand_fcn ff;
88 }; 121 };
89 122
90 class 123 class
91 OCTAVE_API 124 OCTAVE_API
92 DefQuad : public Quad 125 DefQuad : public Quad
110 143
111 ~DefQuad (void) { } 144 ~DefQuad (void) { }
112 145
113 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); 146 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr);
114 147
148 float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr);
149
115 private: 150 private:
116 151
117 double lower_limit; 152 double lower_limit;
118 double upper_limit; 153 double upper_limit;
119 154
136 171
137 ~IndefQuad (void) { } 172 ~IndefQuad (void) { }
138 173
139 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); 174 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr);
140 175
176 float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr);
177
141 private: 178 private:
142 179
143 double bound; 180 double bound;
181 IntegralType type;
182 int integration_error;
183 };
184
185 class
186 OCTAVE_API
187 FloatDefQuad : public Quad
188 {
189 public:
190
191 FloatDefQuad (float_integrand_fcn fcn)
192 : Quad (fcn), lower_limit (0.0), upper_limit (1.0), singularities () { }
193
194 FloatDefQuad (float_integrand_fcn fcn, float ll, float ul)
195 : Quad (fcn), lower_limit (ll), upper_limit (ul), singularities () { }
196
197 FloatDefQuad (float_integrand_fcn fcn, float ll, float ul,
198 const FloatColumnVector& sing)
199 : Quad (fcn), lower_limit (ll), upper_limit (ul),
200 singularities (sing) { }
201
202 FloatDefQuad (float_integrand_fcn fcn, const FloatColumnVector& sing)
203 : Quad (fcn), lower_limit (0.0), upper_limit (1.0),
204 singularities (sing) { }
205
206 ~FloatDefQuad (void) { }
207
208 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr);
209
210 float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr);
211
212 private:
213
214 float lower_limit;
215 float upper_limit;
216
217 FloatColumnVector singularities;
218 };
219
220 class
221 OCTAVE_API
222 FloatIndefQuad : public Quad
223 {
224 public:
225
226 enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite };
227
228 FloatIndefQuad (float_integrand_fcn fcn)
229 : Quad (fcn), bound (0.0), type (bound_to_inf) { }
230
231 FloatIndefQuad (float_integrand_fcn fcn, double b, IntegralType t)
232 : Quad (fcn), bound (b), type (t) { }
233
234 ~FloatIndefQuad (void) { }
235
236 double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr);
237
238 float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr);
239
240 private:
241
242 float bound;
144 IntegralType type; 243 IntegralType type;
145 int integration_error; 244 int integration_error;
146 }; 245 };
147 246
148 #endif 247 #endif