# HG changeset patch # User Jaroslav Hajek # Date 1258112086 -3600 # Node ID 7483fe200fab75a05773310d21207a3f5779b342 # Parent 6631c61a4a4e13d926b9b919f9fea72630e48d8b narrow complex values with negative zero imaginary parts diff -r 6631c61a4a4e -r 7483fe200fab liboctave/CDiagMatrix.cc --- a/liboctave/CDiagMatrix.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/CDiagMatrix.cc Fri Nov 13 12:34:46 2009 +0100 @@ -412,16 +412,7 @@ bool ComplexDiagMatrix::all_elements_are_real (void) const { - octave_idx_type len = length (); - for (octave_idx_type i = 0; i < len; i++) - { - double ip = std::imag (elem (i, i)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - - return true; + return mx_inline_all_real (length (), data ()); } // diagonal matrix by diagonal matrix -> diagonal matrix operations diff -r 6631c61a4a4e -r 7483fe200fab liboctave/CMatrix.cc --- a/liboctave/CMatrix.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/CMatrix.cc Fri Nov 13 12:34:46 2009 +0100 @@ -3118,21 +3118,7 @@ bool ComplexMatrix::all_elements_are_real (void) const { - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = 0; i < nr; i++) - { - double ip = std::imag (elem (i, j)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - } - - return true; + return mx_inline_all_real (numel (), data ()); } // Return nonzero if any element of CM has a non-integer real or diff -r 6631c61a4a4e -r 7483fe200fab liboctave/CNDArray.cc --- a/liboctave/CNDArray.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/CNDArray.cc Fri Nov 13 12:34:46 2009 +0100 @@ -538,17 +538,7 @@ bool ComplexNDArray::all_elements_are_real (void) const { - octave_idx_type nel = nelem (); - - for (octave_idx_type i = 0; i < nel; i++) - { - double ip = std::imag (elem (i)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - - return true; + return mx_inline_all_real (numel (), data ()); } // Return nonzero if any element of CM has a non-integer real or diff -r 6631c61a4a4e -r 7483fe200fab liboctave/CSparse.cc --- a/liboctave/CSparse.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/CSparse.cc Fri Nov 13 12:34:46 2009 +0100 @@ -53,6 +53,7 @@ #include "Sparse-diag-op-defs.h" #include "Sparse-perm-op-defs.h" +#include "mx-inlines.cc" // Define whether to use a basic QR solver or one that uses a Dulmange // Mendelsohn factorization to seperate the problem into under-determined, @@ -7268,17 +7269,7 @@ bool SparseComplexMatrix::all_elements_are_real (void) const { - octave_idx_type nel = nnz (); - - for (octave_idx_type i = 0; i < nel; i++) - { - double ip = std::imag (data (i)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - - return true; + return mx_inline_all_real (nnz (), data ()); } // Return nonzero if any element of CM has a non-integer real or diff -r 6631c61a4a4e -r 7483fe200fab liboctave/ChangeLog --- a/liboctave/ChangeLog Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/ChangeLog Fri Nov 13 12:34:46 2009 +0100 @@ -1,3 +1,15 @@ +2009-11-13 Jaroslav Hajek + + * CNDArray.cc (ComplexNDArray::all_elements_are_real): + Use mx_inline_all_real. + * CMatrix.cc (ComplexMatrix::all_elements_are_real): Ditto. + * fCNDArray.cc (FloatComplexNDArray::all_elements_are_real): + Use mx_inline_all_real. + * fCMatrix.cc (FloatComplexMatrix::all_elements_are_real): Ditto. + * CDiagMatrix.cc (ComplexDiagMatrix::all_elements_are_real): Ditto. + * fCDiagMatrix.cc (FloatComplexDiagMatrix::all_elements_are_real): Ditto. + * CSparse.cc (SparseComplexMatrix::all_elements_are_real): Ditto. + 2009-11-17 Jaroslav Hajek * base-aepbal.h (permuting_vector): Fix lower part swapping. diff -r 6631c61a4a4e -r 7483fe200fab liboctave/fCDiagMatrix.cc --- a/liboctave/fCDiagMatrix.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/fCDiagMatrix.cc Fri Nov 13 12:34:46 2009 +0100 @@ -412,16 +412,7 @@ bool FloatComplexDiagMatrix::all_elements_are_real (void) const { - octave_idx_type len = length (); - for (octave_idx_type i = 0; i < len; i++) - { - float ip = std::imag (elem (i, i)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - - return true; + return mx_inline_all_real (length (), data ()); } // diagonal matrix by diagonal matrix -> diagonal matrix operations diff -r 6631c61a4a4e -r 7483fe200fab liboctave/fCMatrix.cc --- a/liboctave/fCMatrix.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/fCMatrix.cc Fri Nov 13 12:34:46 2009 +0100 @@ -3111,21 +3111,7 @@ bool FloatComplexMatrix::all_elements_are_real (void) const { - octave_idx_type nr = rows (); - octave_idx_type nc = cols (); - - for (octave_idx_type j = 0; j < nc; j++) - { - for (octave_idx_type i = 0; i < nr; i++) - { - float ip = std::imag (elem (i, j)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - } - - return true; + return mx_inline_all_real (numel (), data ()); } // Return nonzero if any element of CM has a non-integer real or diff -r 6631c61a4a4e -r 7483fe200fab liboctave/fCNDArray.cc --- a/liboctave/fCNDArray.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/liboctave/fCNDArray.cc Fri Nov 13 12:34:46 2009 +0100 @@ -533,17 +533,7 @@ bool FloatComplexNDArray::all_elements_are_real (void) const { - octave_idx_type nel = nelem (); - - for (octave_idx_type i = 0; i < nel; i++) - { - float ip = std::imag (elem (i)); - - if (ip != 0.0 || lo_ieee_signbit (ip)) - return false; - } - - return true; + return mx_inline_all_real (numel (), data ()); } // Return nonzero if any element of CM has a non-integer real or diff -r 6631c61a4a4e -r 7483fe200fab src/ChangeLog --- a/src/ChangeLog Wed Nov 18 11:06:45 2009 +0100 +++ b/src/ChangeLog Fri Nov 13 12:34:46 2009 +0100 @@ -1,3 +1,14 @@ +2009-11-13 Jaroslav Hajek + + * ov-complex.cc (octave_complex::try_narrowing_conversion): Don't + check signbit. + * ov-flt-complex.cc (octave_float_complex::try_narrowing_conversion): + Ditto. + * ov-cx-mat.cc (octave_complex_matrix::try_narrowing_conversion): + Simplify. Don't check signbit. + * ov-flt-cx-mat.cc + (octave_float_complex_matrix::try_narrowing_conversion): Ditto. + 2009-11-17 Jaroslav Hajek * ov-re-mat.cc (do_rc_map): New static function. diff -r 6631c61a4a4e -r 7483fe200fab src/ov-complex.cc --- a/src/ov-complex.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/src/ov-complex.cc Fri Nov 13 12:34:46 2009 +0100 @@ -77,7 +77,7 @@ double im = std::imag (scalar); - if (im == 0.0 && ! lo_ieee_signbit (im)) + if (im == 0.0) retval = new octave_scalar (std::real (scalar)); return retval; diff -r 6631c61a4a4e -r 7483fe200fab src/ov-cx-mat.cc --- a/src/ov-cx-mat.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/src/ov-cx-mat.cc Fri Nov 13 12:34:46 2009 +0100 @@ -82,28 +82,14 @@ { octave_base_value *retval = 0; - if (matrix.ndims () == 2) + if (matrix.numel () == 1) { - ComplexMatrix cm = matrix.matrix_value (); - - octave_idx_type nr = cm.rows (); - octave_idx_type nc = cm.cols (); - - if (nr == 1 && nc == 1) - { - Complex c = matrix (0, 0); + Complex c = matrix (0); - double im = std::imag (c); - - if (im == 0.0 && ! lo_ieee_signbit (im)) - retval = new octave_scalar (std::real (c)); - else - retval = new octave_complex (c); - } - else if (nr == 0 || nc == 0) - retval = new octave_matrix (Matrix (nr, nc)); - else if (cm.all_elements_are_real ()) - retval = new octave_matrix (::real (cm)); + if (std::imag (c) == 0.0) + retval = new octave_scalar (std::real (c)); + else + retval = new octave_complex (c); } else if (matrix.all_elements_are_real ()) retval = new octave_matrix (::real (matrix)); diff -r 6631c61a4a4e -r 7483fe200fab src/ov-flt-complex.cc --- a/src/ov-flt-complex.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/src/ov-flt-complex.cc Fri Nov 13 12:34:46 2009 +0100 @@ -62,7 +62,7 @@ float im = std::imag (scalar); - if (im == 0.0 && ! lo_ieee_signbit (im)) + if (im == 0.0) retval = new octave_float_scalar (std::real (scalar)); return retval; diff -r 6631c61a4a4e -r 7483fe200fab src/ov-flt-cx-mat.cc --- a/src/ov-flt-cx-mat.cc Wed Nov 18 11:06:45 2009 +0100 +++ b/src/ov-flt-cx-mat.cc Fri Nov 13 12:34:46 2009 +0100 @@ -71,28 +71,14 @@ { octave_base_value *retval = 0; - if (matrix.ndims () == 2) + if (matrix.numel () == 1) { - FloatComplexMatrix cm = matrix.matrix_value (); - - octave_idx_type nr = cm.rows (); - octave_idx_type nc = cm.cols (); - - if (nr == 1 && nc == 1) - { - FloatComplex c = matrix (0, 0); + FloatComplex c = matrix (0); - float im = std::imag (c); - - if (im == 0.0 && ! lo_ieee_signbit (im)) - retval = new octave_float_scalar (std::real (c)); - else - retval = new octave_float_complex (c); - } - else if (nr == 0 || nc == 0) - retval = new octave_float_matrix (FloatMatrix (nr, nc)); - else if (cm.all_elements_are_real ()) - retval = new octave_float_matrix (::real (cm)); + if (std::imag (c) == 0.0) + retval = new octave_float_scalar (std::real (c)); + else + retval = new octave_float_complex (c); } else if (matrix.all_elements_are_real ()) retval = new octave_float_matrix (::real (matrix));