This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: complex arithmetic in gcc (and various standards)


On Tue, 3 Oct 2006, Jan van Dijk wrote:

> More serious is the fact that the compiler translates 1*(Inf,Inf) into 
> (NaN,NaN). This is plain wrong, but, as Joseph mentioned, the solution 
> requires the implementation of mixed-mode MULT_EXPRESSIONS, since apparently 
> 
> 	1*(Inf,Inf) == (Inf,Inf) != (1,0)*(Inf,Inf)==(NaN,NaN). 

In C99 mode, the libgcc function should be called to ensure that you don't 
get (NaN,NaN), as per the Annex G algorithm.

> Is the latter project suitable for a motivated newby? I am willing to spend 
> some time and effort into this issue, but will definitely need guidance from 
> time to time.

Instead of trying mixed-type expressions, call save_expr on both real and 
complex operands, multiply the real and imaginary parts separately and 
then form a COMPLEX_EXPR of the results.  Likewise for addition, 
subtraction and complex/real division (real/complex division can continue 
to be handled like complex/complex).  You'll need to change how 
build_binary_op uses c_common_type since in these cases you'll no longer 
want to convert both operands to that type - the complex operand should be 
converted to it, but the real operand to the corresponding real type.

-- 
Joseph S. Myers
joseph@codesourcery.com


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]