Mercurial > hg > octave-lyh
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 |