Mercurial > hg > octave-nkf
diff 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 |
line wrap: on
line diff
--- a/liboctave/Quad.h +++ b/liboctave/Quad.h @@ -27,12 +27,14 @@ #include <cfloat> #include "dColVector.h" +#include "fColVector.h" #include "lo-math.h" #if !defined (octave_Quad_typedefs) #define octave_Quad_typedefs 1 typedef double (*integrand_fcn) (double x); +typedef float (*float_integrand_fcn) (float x); #endif @@ -53,6 +55,9 @@ Quad (integrand_fcn fcn) : Quad_options (), f (fcn) { } + Quad (float_integrand_fcn fcn) + : Quad_options (), ff (fcn) { } + virtual ~Quad (void) { } virtual double integrate (void) @@ -62,6 +67,13 @@ return do_integrate (ier, neval, abserr); } + virtual float float_integrate (void) + { + octave_idx_type ier, neval; + float abserr; + return do_integrate (ier, neval, abserr); + } + virtual double integrate (octave_idx_type& ier) { octave_idx_type neval; @@ -69,22 +81,43 @@ return do_integrate (ier, neval, abserr); } + virtual float float_integrate (octave_idx_type& ier) + { + octave_idx_type neval; + float abserr; + return do_integrate (ier, neval, abserr); + } + virtual double integrate (octave_idx_type& ier, octave_idx_type& neval) { double abserr; return do_integrate (ier, neval, abserr); } + virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval) + { + float abserr; + return do_integrate (ier, neval, abserr); + } + virtual double integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr) { return do_integrate (ier, neval, abserr); } + virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr) + { + return do_integrate (ier, neval, abserr); + } + virtual double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr) = 0; + virtual float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr) = 0; + protected: integrand_fcn f; + float_integrand_fcn ff; }; class @@ -112,6 +145,8 @@ double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); + float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr); + private: double lower_limit; @@ -138,6 +173,8 @@ double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); + float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr); + private: double bound; @@ -145,6 +182,68 @@ int integration_error; }; +class +OCTAVE_API +FloatDefQuad : public Quad +{ + public: + + FloatDefQuad (float_integrand_fcn fcn) + : Quad (fcn), lower_limit (0.0), upper_limit (1.0), singularities () { } + + FloatDefQuad (float_integrand_fcn fcn, float ll, float ul) + : Quad (fcn), lower_limit (ll), upper_limit (ul), singularities () { } + + FloatDefQuad (float_integrand_fcn fcn, float ll, float ul, + const FloatColumnVector& sing) + : Quad (fcn), lower_limit (ll), upper_limit (ul), + singularities (sing) { } + + FloatDefQuad (float_integrand_fcn fcn, const FloatColumnVector& sing) + : Quad (fcn), lower_limit (0.0), upper_limit (1.0), + singularities (sing) { } + + ~FloatDefQuad (void) { } + + double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); + + float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr); + + private: + + float lower_limit; + float upper_limit; + + FloatColumnVector singularities; +}; + +class +OCTAVE_API +FloatIndefQuad : public Quad +{ + public: + + enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite }; + + FloatIndefQuad (float_integrand_fcn fcn) + : Quad (fcn), bound (0.0), type (bound_to_inf) { } + + FloatIndefQuad (float_integrand_fcn fcn, double b, IntegralType t) + : Quad (fcn), bound (b), type (t) { } + + ~FloatIndefQuad (void) { } + + double do_integrate (octave_idx_type& ier, octave_idx_type& neval, double& abserr); + + float do_integrate (octave_idx_type& ier, octave_idx_type& neval, float& abserr); + + private: + + float bound; + IntegralType type; + int integration_error; +}; + #endif /*