This topic is complex number portability, not Re: [eigen] FFT for Eigen |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
(Let me try one more time to change the email subject to reflect the
offshoot conversation :)
Gael Guennebaud wrote:
according to other discussions, I committed this change, so, e.g.,
m1.real() = m2.imag() + m3;
AFAIK this is not standard c++ and it fails on at least some older
compilers: g++ (GCC) 3.2.3 20030502 "non-lvalue in assignment"
According to
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#387 it may
not become standard either since the committee seems to favor mutator
functions over lvalues.
The safe "standard" way to do it is something like:
template <typename _Complex, typename _Scalar>
void set_real( _Complex & a, const _Scalar & b) { a =
_Complex( b , a.imag() ); }
(warning: above has not been compiled)
If we tiptoe just a little off the standard path, lets' assume the
array[2] layout, which is a fairly safe assumption, then the following
should work:
reinterpret_cast<_Scalar(&)[2]>(a)[0] = a_real_value
reinterpret_cast<_Scalar(&)[2]>(a)[1] = an_imag_value
and is probably easier for the compiler to optimize correctly.
-- Mark