/*************************************************************************** * Complex.C * * * * Complex numbers, complex arithmetic, and functions of a complex * * variable. * * * * HISTORY * * Name Date Description * * * * arvo 03/02/2000 Initial coding. * * * *--------------------------------------------------------------------------* * Copyright (C) 2000, James Arvo * * * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation. See http://www.fsf.org/copyleft/gpl.html * * * * This program is distributed in the hope that it will be useful, but * * WITHOUT EXPRESS OR IMPLIED WARRANTY of merchantability or fitness for * * any particular purpose. See the GNU General Public License for more * * details. * * * ***************************************************************************/ #include const Complex Complex::i( 0.0, 1.0 ); ostream &operator<<( ostream &out, const Complex &z ) { out << form( "(%f,%f) ", z.Real(), z.Imag() ); return out; } Complex cos( const Complex &z ) { return Complex( cos( z.Real() ) * cosh( z.Imag() ), -sin( z.Real() ) * sinh( z.Imag() ) ); } Complex sin( const Complex &z ) { return Complex( sin( z.Real() ) * cosh( z.Imag() ), cos( z.Real() ) * sinh( z.Imag() ) ); } Complex cosh( const Complex &z ) { return Complex( cosh( z.Real() ) * cos( z.Imag() ), sinh( z.Real() ) * sin( z.Imag() ) ); } Complex sinh( const Complex &z ) { return Complex( sinh( z.Real() ) * cos( z.Imag() ), cosh( z.Real() ) * sin( z.Imag() ) ); } Complex log( const Complex &z ) { float r = sqrt( z.Real() * z.Real() + z.Imag() * z.Imag() ); float t = acos( z.Real() / r ); if( z.Imag() < 0.0 ) t = 2.0 * 3.1415926 - t; return Complex( log(r), t ); }