Mercurial > octave
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 {