diff src/ov-complex.cc @ 7789:82be108cc558

First attempt at single precision tyeps * * * corrections to qrupdate single precision routines * * * prefer demotion to single over promotion to double * * * Add single precision support to log2 function * * * Trivial PROJECT file update * * * Cache optimized hermitian/transpose methods * * * Add tests for tranpose/hermitian and ChangeLog entry for new transpose code
author David Bateman <dbateman@free.fr>
date Sun, 27 Apr 2008 22:34:17 +0200
parents 39930366b709
children c777f3ce02d8
line wrap: on
line diff
--- a/src/ov-complex.cc	Wed May 14 18:09:56 2008 +0200
+++ b/src/ov-complex.cc	Sun Apr 27 22:34:17 2008 +0200
@@ -35,6 +35,7 @@
 #include "oct-stream.h"
 #include "ops.h"
 #include "ov-complex.h"
+#include "ov-flt-complex.h"
 #include "ov-base.h"
 #include "ov-base-scalar.h"
 #include "ov-base-scalar.cc"
@@ -42,6 +43,7 @@
 #include "ov-scalar.h"
 #include "gripes.h"
 #include "pr-output.h"
+#include "ops.h"
 
 #include "ls-oct-ascii.h"
 #include "ls-hdf5.h"
@@ -53,6 +55,20 @@
 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_complex,
 				     "complex scalar", "double");
 
+static octave_base_value *
+default_numeric_demotion_function (const octave_base_value& a)
+{
+  CAST_CONV_ARG (const octave_complex&);
+
+  return new octave_float_complex (v.float_complex_value ());
+}
+
+octave_base_value::type_conv_fcn
+octave_complex::numeric_demotion_function (void) const
+{
+  return default_numeric_demotion_function;
+}
+
 octave_base_value *
 octave_complex::try_narrowing_conversion (void)
 {
@@ -107,6 +123,20 @@
   return retval;
 }
 
+float
+octave_complex::float_value (bool force_conversion) const
+{
+  float retval = lo_ieee_float_nan_value ();
+
+  if (! force_conversion)
+    gripe_implicit_conversion ("Octave:imag-to-real",
+			       "complex scalar", "real scalar");
+
+  retval = std::real (scalar);
+
+  return retval;
+}
+
 Matrix
 octave_complex::matrix_value (bool force_conversion) const
 {
@@ -121,6 +151,20 @@
   return retval;
 }
 
+FloatMatrix
+octave_complex::float_matrix_value (bool force_conversion) const
+{
+  FloatMatrix retval;
+
+  if (! force_conversion)
+    gripe_implicit_conversion ("Octave:imag-to-real",
+			       "complex scalar", "real matrix");
+
+  retval = FloatMatrix (1, 1, std::real (scalar));
+
+  return retval;
+}
+
 NDArray
 octave_complex::array_value (bool force_conversion) const
 {
@@ -135,12 +179,31 @@
   return retval;
 }
 
+FloatNDArray
+octave_complex::float_array_value (bool force_conversion) const
+{
+  FloatNDArray retval;
+
+  if (! force_conversion)
+    gripe_implicit_conversion ("Octave:imag-to-real",
+			       "complex scalar", "real matrix");
+
+  retval = FloatNDArray (dim_vector (1, 1), std::real (scalar));
+
+  return retval;
+}
+
 Complex
 octave_complex::complex_value (bool) const
 {
   return scalar;
 }
 
+FloatComplex
+octave_complex::float_complex_value (bool) const
+{
+  return static_cast<FloatComplex> (scalar);
+}
 
 ComplexMatrix
 octave_complex::complex_matrix_value (bool) const
@@ -148,12 +211,24 @@
   return ComplexMatrix (1, 1, scalar);
 }
 
+FloatComplexMatrix
+octave_complex::float_complex_matrix_value (bool) const
+{
+  return FloatComplexMatrix (1, 1, static_cast<FloatComplex> (scalar));
+}
+
 ComplexNDArray
 octave_complex::complex_array_value (bool /* force_conversion */) const
 {
   return ComplexNDArray (dim_vector (1, 1), scalar);
 }
 
+FloatComplexNDArray
+octave_complex::float_complex_array_value (bool /* force_conversion */) const
+{
+  return FloatComplexNDArray (dim_vector (1, 1), static_cast<FloatComplex> (scalar));
+}
+
 octave_value 
 octave_complex::resize (const dim_vector& dv, bool fill) const
 {