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
 
 /*