Arithmetic/Complex: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|J}}: Add lang tags)
m (Fixed lang tags.)
Line 51: Line 51:
-- Conjugation
-- Conjugation
C := Conjugate (C);
C := Conjugate (C);
end Complex_Operations;
end Complex_Operations;</lang>
</lang>


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
main:(
<lang algol68>main:(
FORMAT compl fmt = $g(-7,5)"&perp;"g(-7,5)$;
FORMAT compl fmt = $g(-7,5)""g(-7,5)$;
PROC compl operations = VOID: (
PROC compl operations = VOID: (
LONG COMPL a = 1.0 &perp; 1.0;
LONG COMPL a = 1.0 1.0;
LONG COMPL b = 3.14159 &perp; 1.2;
LONG COMPL b = 3.14159 1.2;
LONG COMPL c;
LONG COMPL c;
printf(($x"a="f(compl fmt)l$,a));
printf(($x"a="f(compl fmt)l$,a));
printf(($x"b="f(compl fmt)l$,b));
printf(($x"b="f(compl fmt)l$,b));
# addition #
# addition #
c := a + b;
c := a + b;
printf(($x"a+b="f(compl fmt)l$,c));
printf(($x"a+b="f(compl fmt)l$,c));
# multiplication #
# multiplication #
c := a * b;
c := a * b;
printf(($x"a*b="f(compl fmt)l$,c));
printf(($x"a*b="f(compl fmt)l$,c));
# inversion #
# inversion #
c := 1.0 / a;
c := 1.0 / a;
printf(($x"1/c="f(compl fmt)l$,c));
printf(($x"1/c="f(compl fmt)l$,c));
# negation #
# negation #
c := -a;
c := -a;
printf(($x"-a="f(compl fmt)l$,c))
printf(($x"-a="f(compl fmt)l$,c))
);
);
compl operations
compl operations
)</lang>
)
Output:
Output:
a=1.00000&perp;1.00000
<lang algol68>a=1.00000⊥1.00000
b=3.14159&perp;1.20000
b=3.14159⊥1.20000
a+b=4.14159&perp;2.20000
a+b=4.14159⊥2.20000
a*b=1.94159&perp;4.34159
a*b=1.94159⊥4.34159
1/c=0.50000&perp;-.50000
1/c=0.50000⊥-.50000
-a=-1.0000&perp;-1.0000
-a=-1.0000⊥-1.0000</lang>
=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276431.html#276431 forum]
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276431.html#276431 forum]
<lang AutoHotkey>
<lang AutoHotkey>Cset(C,1,1)
Cset(C,1,1)
MsgBox % Cstr(C) ; 1 + i*1
MsgBox % Cstr(C) ; 1 + i*1
Cneg(C,C)
Cneg(C,C)
Line 197: Line 195:
{{works with|C99}}
{{works with|C99}}
The more recent [[C99]] standard has built-in complex number primitive types, which can be declared with float, double, or long double precision. To use these types and their associated library functions, you must include the <complex.h> header. (Note: this is a ''different'' header than the <complex> templates that are defined by [[C++]].) [http://www.opengroup.org/onlinepubs/009695399/basedefs/complex.h.html] [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc03complex_types.htm]
The more recent [[C99]] standard has built-in complex number primitive types, which can be declared with float, double, or long double precision. To use these types and their associated library functions, you must include the <complex.h> header. (Note: this is a ''different'' header than the <complex> templates that are defined by [[C++]].) [http://www.opengroup.org/onlinepubs/009695399/basedefs/complex.h.html] [http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc03complex_types.htm]
<lang c>
<lang c>#include <complex.h>
#include <complex.h>


void cprint(double complex c)
void cprint(double complex c)
Line 225: Line 222:
c = -a;
c = -a;
printf("\n-a="); cprint(c); printf("\n");
printf("\n-a="); cprint(c); printf("\n");
}</lang>
}
</lang>


{{works with|C89}}
{{works with|C89}}
Line 280: Line 276:
printf("\n1/a="); put(inv(a));
printf("\n1/a="); put(inv(a));
printf("\n-a="); put(neg(a)); printf("\n");
printf("\n-a="); put(neg(a)); printf("\n");
}</lang>
}
</lang>


=={{header|C++}}==
=={{header|C++}}==
<lang cpp>
<lang cpp>#include <iostream>
#include <iostream>
#include <complex>
#include <complex>
using std::complex;
using std::complex;
Line 301: Line 295:
// negation
// negation
std::cout << -a << std::endl;
std::cout << -a << std::endl;
}</lang>
}
</lang>


=={{header|C sharp|C#}}==
=={{header|C sharp|C#}}==
Line 515: Line 508:
Complex numbers are a built-in numeric type in Common Lisp. The literal syntax for a complex number is <tt>#C(<var>real</var> <var>imaginary</var>)</tt>. The components of a complex number may be integers, ratios, or floating-point. Arithmetic operations automatically return complex (or real) numbers when appropriate:
Complex numbers are a built-in numeric type in Common Lisp. The literal syntax for a complex number is <tt>#C(<var>real</var> <var>imaginary</var>)</tt>. The components of a complex number may be integers, ratios, or floating-point. Arithmetic operations automatically return complex (or real) numbers when appropriate:


> (sqrt -1)
<lang lisp>> (sqrt -1)
#C(0.0 1.0)
#C(0.0 1.0)


> (expt #c(0 1) 2)
> (expt #c(0 1) 2)
-1</lang>
-1


Here are some arithmetic operations on complex numbers:
Here are some arithmetic operations on complex numbers:


> (+ #c(0 1) #c(1 0))
<lang lisp>> (+ #c(0 1) #c(1 0))
#C(1 1)
#C(1 1)

> (* #c(1 1) 2)
> (* #c(1 1) 2)
#C(2 2)
#C(2 2)

> (* #c(1 1) #c(0 2))
> (* #c(1 1) #c(0 2))
#C(-2 2)
#C(-2 2)

> (- #c(1 1))
> (- #c(1 1))
#C(-1 -1)
#C(-1 -1)

> (/ #c(0 2))
> (/ #c(0 2))
#C(0 -1/2)
#C(0 -1/2)</lang>


Complex numbers can be constructed from real and imaginary parts using the <tt>complex</tt> function, and taken apart using the <tt>realpart</tt> and <tt>imagpart</tt> functions.
Complex numbers can be constructed from real and imaginary parts using the <tt>complex</tt> function, and taken apart using the <tt>realpart</tt> and <tt>imagpart</tt> functions.


> (complex 64 (/ 3 4))
<lang lisp>> (complex 64 (/ 3 4))
#C(64 3/4)
#C(64 3/4)


> (realpart #c(5 5))
> (realpart #c(5 5))
5
5


> (imagpart (complex 0 pi))
> (imagpart (complex 0 pi))
3.141592653589793d0
3.141592653589793d0</lang>


=={{header|D}}==
=={{header|D}}==
Line 568: Line 561:
There is no standard syntax or mechanism for complex numbers. The FSL provides several implementations suitable for different uses. This example uses the existing floating point stack, but other libraries define a separate complex stack and/or a fixed-point implementation suitable for microcontrollers and DSPs.
There is no standard syntax or mechanism for complex numbers. The FSL provides several implementations suitable for different uses. This example uses the existing floating point stack, but other libraries define a separate complex stack and/or a fixed-point implementation suitable for microcontrollers and DSPs.


include complex.seq
<lang forth>include complex.seq

: ZNEGATE ( r i -- -r -i ) fswap fnegate fswap fnegate ;
: ZNEGATE ( r i -- -r -i ) fswap fnegate fswap fnegate ;

zvariable x
zvariable x
zvariable y
zvariable y
1e 1e x z!
1e 1e x z!
pi 1.2e y z!
pi 1.2e y z!

x z@ y z@ z+ z.
x z@ y z@ z+ z.
x z@ y z@ z* z.
x z@ y z@ z* z.
1+0i x z@ z/ z.
1+0i x z@ z/ z.
x z@ znegate z.
x z@ znegate z.</lang>


=={{header|Fortran}}==
=={{header|Fortran}}==
In ANSI FORTRAN 66 or later, COMPLEX is a built-in data type with full access to intrinsic arithmetic operations. Putting each native operation in a function is horribly inefficient, so I will simply demonstrate the operations. This example shows usage for Fortran 90 or later:
In ANSI FORTRAN 66 or later, COMPLEX is a built-in data type with full access to intrinsic arithmetic operations. Putting each native operation in a function is horribly inefficient, so I will simply demonstrate the operations. This example shows usage for Fortran 90 or later:
<lang fortran> program cdemo
<lang fortran>program cdemo
complex :: a = (5,3), b = (0.5, 6.0) ! complex initializer
complex :: a = (5,3), b = (0.5, 6.0) ! complex initializer
complex :: absum, abprod, aneg, ainv
complex :: absum, abprod, aneg, ainv
absum = a + b
absum = a + b
abprod = a * b
abprod = a * b
aneg = -a
aneg = -a
ainv = 1.0 / a
ainv = 1.0 / a
end program cdemo</lang>
end program cdemo</lang>


And, although you did not ask, here are demonstrations of some other common complex number operations
And, although you did not ask, here are demonstrations of some other common complex number operations
<lang fortran> program cdemo2
<lang fortran>program cdemo2
complex :: a = (5,3), b = (0.5, 6) ! complex initializer
complex :: a = (5,3), b = (0.5, 6) ! complex initializer
real, parameter :: pi = 3.141592653589793 ! The constant "pi"
real, parameter :: pi = 3.141592653589793 ! The constant "pi"
complex, parameter :: i = (0, 1) ! the imaginary unit "i" (sqrt(-1))
complex, parameter :: i = (0, 1) ! the imaginary unit "i" (sqrt(-1))
complex :: abdiff, abquot, abpow, aconj, p2cart, newc
complex :: abdiff, abquot, abpow, aconj, p2cart, newc
real :: areal, aimag, anorm, rho = 10, theta = pi / 3.0, x = 2.3, y = 3.0
real :: areal, aimag, anorm, rho = 10, theta = pi / 3.0, x = 2.3, y = 3.0
integer, parameter :: n = 50
integer, parameter :: n = 50
integer :: j
integer :: j
complex, dimension(0:n-1) :: unit_circle
complex, dimension(0:n-1) :: unit_circle
abdiff = a - b
abdiff = a - b
abquot = a / b
abquot = a / b
abpow = a ** b
abpow = a ** b
areal = real(a) ! Real part
areal = real(a) ! Real part
aimag = imag(a) ! Imaginary part
aimag = imag(a) ! Imaginary part
newc = cmplx(x,y) ! Creating a complex on the fly from two reals intrinsically
newc = cmplx(x,y) ! Creating a complex on the fly from two reals intrinsically
! (initializer only works in declarations)
! (initializer only works in declarations)
newc = x + y*i ! Creating a complex on the fly from two reals arithmetically
newc = x + y*i ! Creating a complex on the fly from two reals arithmetically
anorm = abs(a) ! Complex norm (or "modulus" or "absolute value")
anorm = abs(a) ! Complex norm (or "modulus" or "absolute value")
! (use CABS before Fortran 90)
! (use CABS before Fortran 90)
aconj = conjg(a) ! Complex conjugate (same as real(a) - i*imag(a))
aconj = conjg(a) ! Complex conjugate (same as real(a) - i*imag(a))
p2cart = rho * exp(i * theta) ! Euler's polar complex notation to cartesian complex notation
p2cart = rho * exp(i * theta) ! Euler's polar complex notation to cartesian complex notation
! conversion (use CEXP before Fortran 90)
! conversion (use CEXP before Fortran 90)
! The following creates an array of N evenly spaced points around the complex unit circle
! The following creates an array of N evenly spaced points around the complex unit circle
! useful for FFT calculations, among other things
! useful for FFT calculations, among other things
unit_circle = exp(2*i*pi/n * (/ (j, j=0, n-1) /) )
unit_circle = exp(2*i*pi/n * (/ (j, j=0, n-1) /) )
end program cdemo2</lang>
end program cdemo2</lang>


=={{header|Groovy}}==
=={{header|Groovy}}==
Line 789: Line 782:
have ''Complex Integer'' for the Gaussian Integers, ''Complex Float'', ''Complex Double'', etc. The operations are just the usual overloaded numeric operations.
have ''Complex Integer'' for the Gaussian Integers, ''Complex Float'', ''Complex Double'', etc. The operations are just the usual overloaded numeric operations.


import Data.Complex
<lang haskell>import Data.Complex

main = do
main = do
let a = 1.0 :+ 2.0 -- complex number 1+2i
let a = 1.0 :+ 2.0 -- complex number 1+2i
let b = fromInteger 4 -- complex number 4+0i
let b = fromInteger 4 -- complex number 4+0i
putStrLn $ "Add: " ++ show (a + b)
putStrLn $ "Add: " ++ show (a + b)
putStrLn $ "Subtract: " ++ show (a - b)
putStrLn $ "Subtract: " ++ show (a - b)
putStrLn $ "Multiply: " ++ show (a * b)
putStrLn $ "Multiply: " ++ show (a * b)
putStrLn $ "Divide: " ++ show (a / b)
putStrLn $ "Divide: " ++ show (a / b)
putStrLn $ "Negate: " ++ show (-a)
putStrLn $ "Negate: " ++ show (-a)
putStrLn $ "Inverse: " ++ show (recip a)
putStrLn $ "Inverse: " ++ show (recip a)</lang>


Output:
Output:


*Main> main
<lang haskell>*Main> main
Add: 5.0 :+ 2.0
Add: 5.0 :+ 2.0
Subtract: (-3.0) :+ 2.0
Subtract: (-3.0) :+ 2.0
Multiply: 4.0 :+ 8.0
Multiply: 4.0 :+ 8.0
Divide: 0.25 :+ 0.5
Divide: 0.25 :+ 0.5
Negate: (-1.0) :+ (-2.0)
Negate: (-1.0) :+ (-2.0)
Inverse: 0.2 :+ (-0.4)
Inverse: 0.2 :+ (-0.4)</lang>


=={{header|IDL}}==
=={{header|IDL}}==
Line 815: Line 808:
<tt>complex</tt> (and <tt>dcomplex</tt> for double-precision) is a built-in data type in IDL:
<tt>complex</tt> (and <tt>dcomplex</tt> for double-precision) is a built-in data type in IDL:


<lang idl>x=complex(1,1)
<pre>
x=complex(1,1)
y=complex(!pi,1.2)
y=complex(!pi,1.2)
print,x+y
print,x+y
Line 825: Line 817:
( -1.00000, -1.00000)
( -1.00000, -1.00000)
print,1/x
print,1/x
( 0.500000, -0.500000)
( 0.500000, -0.500000)</lang>
</pre>


=={{header|J}}==
=={{header|J}}==
Line 839: Line 830:
0.5j_0.5
0.5j_0.5
-x
-x
_1j_1
_1j_1</lang>
</lang>


=={{header|Java}}==
=={{header|Java}}==
Line 885: Line 875:
=={{header|JavaScript}}==
=={{header|JavaScript}}==


<lang javascript>
<lang javascript>function Complex ( r, i ){
function Complex ( r, i ){
this.r = r;
this.r = r;
this.i = i;
this.i = i;
Line 931: Line 920:
Complex.prototype.getMod = function ( ){
Complex.prototype.getMod = function ( ){
return Math.sqrt( Math.pow(this.r,2) , Math.pow(this.i,2) )
return Math.sqrt( Math.pow(this.r,2) , Math.pow(this.i,2) )
}</lang>
}

</lang>


=={{header|Maple}}==
=={{header|Maple}}==
Line 939: Line 926:
Maple has "I" (the square root of -1) built-in. Thus:
Maple has "I" (the square root of -1) built-in. Thus:


x := 1+I;
<lang maple>x := 1+I;
y := Pi+I*1.2;
y := Pi+I*1.2;</lang>


By itself, it will perform mathematical operations symbolically, i.e. it will not try to perform computational evaluation unless specifically asked to do so. Thus:
By itself, it will perform mathematical operations symbolically, i.e. it will not try to perform computational evaluation unless specifically asked to do so. Thus:


x*y;
<lang maple>x*y;
==> (1 + I) (Pi + 1.2 I)
==> (1 + I) (Pi + 1.2 I)
simplify(x*y);
simplify(x*y);
==> 1.941592654 + 4.341592654 I
==> 1.941592654 + 4.341592654 I</lang>


Other than that, the task merely asks for
Other than that, the task merely asks for


x+y;
<lang maple>x+y;
x*y;
x*y;
-x;
-x;
1/x;
1/x;</lang>


=={{header|Mathematica}}==
=={{header|Mathematica}}==
Mathematica has fully implemented support for complex numbers throughout the software. Addition, subtraction, division, multiplications and powering need no further syntax than for real numbers:
Mathematica has fully implemented support for complex numbers throughout the software. Addition, subtraction, division, multiplications and powering need no further syntax than for real numbers:
<lang Mathematica>
<lang Mathematica>x=1+2I
x=1+2I
y=3+4I
y=3+4I


x+y => 4 + 6 I
x+y => 4 + 6 I
x-y => -2 - 2 I
x-y => -2 - 2 I
y x => -5 + 10 I
y x => -5 + 10 I
y/x => 11/5 - (2 I)/5
y/x => 11/5 - (2 I)/5
x^3 => -11 - 2 I
x^3 => -11 - 2 I
y^4 => -527 - 336 I
y^4 => -527 - 336 I
x^y => (1 + 2 I)^(3 + 4 I)
x^y => (1 + 2 I)^(3 + 4 I)
N[x^y] => 0.12901 + 0.0339241 I
N[x^y] => 0.12901 + 0.0339241 I</lang>
</lang>
Powering to a complex power can in general not be written shorter, so Mathematica leaves it unevaluated if the numbers are exact. An approximation can be acquired using the function N.
Powering to a complex power can in general not be written shorter, so Mathematica leaves it unevaluated if the numbers are exact. An approximation can be acquired using the function N.
However Mathematica goes much further, basically all functions can handle complex numbers to arbitrary precision, including (but not limited to!):
However Mathematica goes much further, basically all functions can handle complex numbers to arbitrary precision, including (but not limited to!):
<lang Mathematica>
<lang Mathematica>Exp Log
Exp Log
Sin Cos Tan Csc Sec Cot
Sin Cos Tan Csc Sec Cot
ArcSin ArcCos ArcTan ArcCsc ArcSec ArcCot
ArcSin ArcCos ArcTan ArcCsc ArcSec ArcCot
Line 982: Line 966:
Haversine InverseHaversine
Haversine InverseHaversine
Factorial Gamma PolyGamma LogGamma
Factorial Gamma PolyGamma LogGamma
Erf BarnesG Hyperfactorial Zeta ProductLog RamanujanTauL
Erf BarnesG Hyperfactorial Zeta ProductLog RamanujanTauL</lang>
</lang>
and many many more. The documentation states:
and many many more. The documentation states:


Line 1,021: Line 1,004:


=={{header|Pascal}}==
=={{header|Pascal}}==
<lang pascal>
<lang pascal>program showcomplex(output);
program showcomplex(output);


type
type
Line 1,089: Line 1,071:
print(zr); { prints (-9,38) }
print(zr); { prints (-9,38) }
writeln
writeln
end.
end.</lang>
</lang>


=={{header|Perl}}==
=={{header|Perl}}==
Line 1,115: Line 1,096:
'1 -: 3' is '1 - 3i' in mathematical notation.
'1 -: 3' is '1 - 3i' in mathematical notation.


<lang pop11>lvars a = 1.0 +: 1.0, b = 2.0 +: 5.0 ;
<pre>
lvars a = 1.0 +: 1.0, b = 2.0 +: 5.0 ;
a+b =>
a+b =>
a*b =>
a*b =>
Line 1,134: Line 1,114:
a-a =>
a-a =>
a/b =>
a/b =>
a/a =>
a/a =></lang>
</pre>


=={{header|Python}}==
=={{header|Python}}==
Line 1,188: Line 1,167:
=={{header|Slate}}==
=={{header|Slate}}==


<lang slate>
<lang slate>[| a b |
[| a b |
a: 1 + 1 i.
a: 1 + 1 i.
b: Pi + 1.2 i.
b: Pi + 1.2 i.
Line 1,199: Line 1,177:
print: a abs.
print: a abs.
print: a negated.
print: a negated.
].
].</lang>
</lang>


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==
Line 1,238: Line 1,215:
The choice of examples here is {{trans|Common Lisp}}.
The choice of examples here is {{trans|Common Lisp}}.


<pre style="font-family: 'TI Uni';">■ √(–1) 
<lang ti89b>■ √(–1) 
■ ^2 —1
■ ^2 —1
■  + 1 1 + 
■  + 1 1 + 
Line 1,246: Line 1,223:
■ 1/(2) —1 - 
■ 1/(2) —1 - 
■ real(1 + 2) 1
■ real(1 + 2) 1
■ imag(1 + 2) 2</pre>
■ imag(1 + 2) 2</lang>


Complex numbers can also be entered and displayed in polar form. (This example shows input in polar form while the complex display mode is rectangular and the angle mode is radians).
Complex numbers can also be entered and displayed in polar form. (This example shows input in polar form while the complex display mode is rectangular and the angle mode is radians).


<pre style="font-family: 'TI Uni';">■ (1∠π/4)
<lang ti89b>■ (1∠π/4)
√(2)/2 + √(2)/2*</pre>
√(2)/2 + √(2)/2*</lang>


Note that the parentheses around ∠ notation are required. It has a related use in vectors: (1∠π/4) is a complex number, [1,∠π/4] is a vector in two dimensions in polar notation, and [(1∠π/4)] is a complex number in a vector.
Note that the parentheses around ∠ notation are required. It has a related use in vectors: (1∠π/4) is a complex number, [1,∠π/4] is a vector in two dimensions in polar notation, and [(1∠π/4)] is a complex number in a vector.

Revision as of 18:56, 19 November 2009

Task
Arithmetic/Complex
You are encouraged to solve this task according to the task description, using any language you may know.

A complex number is a number which can be written as "a + b*i" (sometimes shown as "b + a*i") where a and b are real numbers and i is the square root of -1. Typically, complex numbers are represented as a pair of real numbers called the "imaginary part" and "real part", where the imaginary part is the number to be multiplied by i.

Show addition, multiplication, negation, and inversion of complex numbers in separate functions (subtraction and division operations can be made with pairs of these operations). Print the results for each operation tested.

Some languages have complex number libraries available. If your language does, show the operations. If your language does not, also show the definition of this type.

Ada

<lang ada>with Ada.Numerics.Generic_Complex_Types; with Ada.Text_IO.Complex_IO;

procedure Complex_Operations is

  -- Ada provides a pre-defined generic package for complex types
  -- That package contains definitions for composition,
  -- negation, addition, subtraction, multiplication, division,
  -- conjugation, exponentiation, and absolute value, as well as
  -- basic comparison operations.
  -- Ada provides a second pre-defined package for sin, cos, tan, cot,
  -- arcsin, arccos, arctan, arccot, and the hyperbolic versions of 
  -- those trigonometric functions.
  
  -- The package Ada.Numerics.Generic_Complex_Types requires definition
  -- with the real type to be used in the complex type definition.
  
  package Complex_Types is new Ada.Numerics.Generic_Complex_Types (Long_Float);
  use Complex_Types;
  package Complex_IO is new Ada.Text_IO.Complex_IO (Complex_Types);
  use Complex_IO;
  use Ada.Text_IO;
  
  A : Complex := Compose_From_Cartesian (Re => 1.0, Im => 1.0);
  B : Complex := Compose_From_Polar (Modulus => 1.0, Argument => 3.14159);
  C : Complex;
 

begin

  -- Addition
  C := A + B;
  Put("A + B = "); Put(C);
  New_Line;
  -- Multiplication
  C := A * B;
  Put("A * B = "); Put(C);
  New_Line;
  -- Inversion
  C := 1.0 / A;
  Put("1.0 / A = "); Put(C);
  New_Line;
  -- Negation
  C := -A;
  Put("-A = "); Put(C);
  New_Line;
  -- Conjugation
  C := Conjugate (C);

end Complex_Operations;</lang>

ALGOL 68

<lang algol68>main:(

 FORMAT compl fmt = $g(-7,5)"⊥"g(-7,5)$;
 
 PROC compl operations = VOID: (
   LONG COMPL a = 1.0 ⊥ 1.0;
   LONG COMPL b = 3.14159 ⊥ 1.2;
 
   LONG COMPL c;
 
   printf(($x"a="f(compl fmt)l$,a));
   printf(($x"b="f(compl fmt)l$,b));
 
   # addition #
   c := a + b;
   printf(($x"a+b="f(compl fmt)l$,c));
   # multiplication #
   c := a * b;
   printf(($x"a*b="f(compl fmt)l$,c));
   # inversion #
   c := 1.0 / a;
   printf(($x"1/c="f(compl fmt)l$,c));
   # negation #
   c := -a;
   printf(($x"-a="f(compl fmt)l$,c))
 ); 
 compl operations

)</lang> Output: <lang algol68>a=1.00000⊥1.00000 b=3.14159⊥1.20000 a+b=4.14159⊥2.20000 a*b=1.94159⊥4.34159 1/c=0.50000⊥-.50000 -a=-1.0000⊥-1.0000</lang>

AutoHotkey

contributed by Laszlo on the ahk forum <lang AutoHotkey>Cset(C,1,1) MsgBox % Cstr(C)  ; 1 + i*1 Cneg(C,C) MsgBox % Cstr(C)  ; -1 - i*1 Cadd(C,C,C) MsgBox % Cstr(C)  ; -2 - i*2 Cinv(D,C) MsgBox % Cstr(D)  ; -0.25 + 0.25*i Cmul(C,C,D) MsgBox % Cstr(C)  ; 1 + i*0

Cset(ByRef C, re, im) {

  VarSetCapacity(C,16)
  NumPut(re,C,0,"double")
  NumPut(im,C,8,"double")

} Cre(ByRef C) {

  Return NumGet(C,0,"double")

} Cim(ByRef C) {

  Return NumGet(C,8,"double")

} Cstr(ByRef C) {

  Return Cre(C) ((i:=Cim(C))<0 ? " - i*" . -i : " + i*" . i)

} Cadd(ByRef C, ByRef A, ByRef B) {

  VarSetCapacity(C,16)
  NumPut(Cre(A)+Cre(B),C,0,"double")
  NumPut(Cim(A)+Cim(B),C,8,"double")

} Cmul(ByRef C, ByRef A, ByRef B) {

  VarSetCapacity(C,16)
  t := Cre(A)*Cim(B)+Cim(A)*Cre(B)
  NumPut(Cre(A)*Cre(B)-Cim(A)*Cim(B),C,0,"double")
  NumPut(t,C,8,"double") ; A or B can be C!

} Cneg(ByRef C, ByRef A) {

  VarSetCapacity(C,16)
  NumPut(-Cre(A),C,0,"double")
  NumPut(-Cim(A),C,8,"double")

} Cinv(ByRef C, ByRef A) {

  VarSetCapacity(C,16)
  d := Cre(A)**2 + Cim(A)**2
  NumPut( Cre(A)/d,C,0,"double")
  NumPut(-Cim(A)/d,C,8,"double")

}</lang>

BASIC

Works with: QuickBasic version 4.5

<lang qbasic>TYPE complex

       real AS DOUBLE
       imag AS DOUBLE

END TYPE DECLARE SUB add (a AS complex, b AS complex, c AS complex) DECLARE SUB mult (a AS complex, b AS complex, c AS complex) DECLARE SUB inv (a AS complex, b AS complex) DECLARE SUB neg (a AS complex, b AS complex) CLS DIM x AS complex DIM y AS complex DIM z AS complex x.real = 1 x.imag = 1 y.real = 2 y.imag = 2 CALL add(x, y, z) PRINT z.real; "+"; z.imag; "i" CALL mult(x, y, z) PRINT z.real; "+"; z.imag; "i" CALL inv(x, z) PRINT z.real; "+"; z.imag; "i" CALL neg(x, z) PRINT z.real; "+"; z.imag; "i"


SUB add (a AS complex, b AS complex, c AS complex)

       c.real = a.real + b.real
       c.imag = a.imag + b.imag

END SUB

SUB inv (a AS complex, b AS complex)

       denom = a.real ^ 2 + a.imag ^ 2
       b.real = a.real / denom
       b.imag = -a.imag / denom

END SUB

SUB mult (a AS complex, b AS complex, c AS complex)

       c.real = a.real * b.real - a.imag * b.imag
       c.imag = a.real * b.imag + a.imag * b.real

END SUB

SUB neg (a AS complex, b AS complex)

       b.real = -a.real
       b.imag = -a.imag

END SUB</lang> Output:

 3 + 3 i
 0 + 4 i
 .5 +-.5 i
-1 +-1 i

C

Works with: C99

The more recent C99 standard has built-in complex number primitive types, which can be declared with float, double, or long double precision. To use these types and their associated library functions, you must include the <complex.h> header. (Note: this is a different header than the <complex> templates that are defined by C++.) [1] [2] <lang c>#include <complex.h>

void cprint(double complex c) {

 printf("%lf%+lfI", creal(c), cimag(c));

} void complex_operations() {

 double complex a = 1.0 + 1.0I;
 double complex b = 3.14159 + 1.2I;
 double complex c;
 printf("\na="); cprint(a);
 printf("\nb="); cprint(b);
 // addition
 c = a + b;
 printf("\na+b="); cprint(c);
 // multiplication
 c = a * b;
 printf("\na*b="); cprint(c);
 // inversion
 c = 1.0 / a;
 printf("\n1/c="); cprint(c);
 // negation
 c = -a;
 printf("\n-a="); cprint(c); printf("\n");

}</lang>

Works with: C89

User-defined type: <lang c>typedef struct{

       double real;
       double imag;

} Complex;

Complex add(Complex a, Complex b){

       Complex ans;
       ans.real = a.real + b.real;
       ans.imag = a.imag + b.imag;
       return ans;

}

Complex mult(Complex a, Complex b){

       Complex ans;
       ans.real = a.real * b.real - a.imag * b.imag;
       ans.imag = a.real * b.imag + a.imag * b.real;
       return ans;

}

Complex inv(Complex a){

       Complex ans;
       double denom = a.real * a.real + a.imag * a.imag;
       ans.real = a.real / denom;
       ans.imag = -a.imag / denom;
       return ans;

}

Complex neg(Complex a){

       Complex ans;
       ans.real = -a.real;
       ans.imag = -a.imag;
       return ans;

}

void put(Complex c) {

 printf("%lf%+lfI", c.real, c.imag);

}

void complex_ops(void) {

 Complex a = { 1.0,     1.0 };
 Complex b = { 3.14159, 1.2 };
 
 printf("\na=");   put(a);
 printf("\nb=");   put(b);
 printf("\na+b="); put(add(a,b));
 printf("\na*b="); put(mult(a,b));
 printf("\n1/a="); put(inv(a));
 printf("\n-a=");  put(neg(a));  printf("\n");

}</lang>

C++

<lang cpp>#include <iostream>

  1. include <complex>

using std::complex;

void complex_operations() {

 complex<double> a(1.0, 1.0);
 complex<double> b(3.14159, 1.25);
 // addition
 std::cout << a + b << std::endl;
 // multiplication
 std::cout << a * b << std::endl;
 // inversion
 std::cout << 1.0 / a << std::endl;
 // negation
 std::cout << -a << std::endl;

}</lang>

C#

<lang csharp>using System;

public struct ComplexNumber {

   public static readonly ComplexNumber i = new ComplexNumber(0.0, 1.0);
   public static readonly ComplexNumber Zero = new ComplexNumber(0.0, 0.0);
   
   public double Re;
   public double Im;
   public ComplexNumber(double re)
   {
       this.Re = re;
       this.Im = 0;
   }
   public ComplexNumber(double re, double im)
   {
       this.Re = re;
       this.Im = im;
   }
   public static ComplexNumber operator *(ComplexNumber n1, ComplexNumber n2)
   {
       return new ComplexNumber(n1.Re * n2.Re - n1.Im * n2.Im,
           n1.Im * n2.Re + n1.Re * n2.Im);
   }
   public static ComplexNumber operator *(double n1, ComplexNumber n2)
   {
       return new ComplexNumber(n1 * n2.Re, n1 * n2.Im);
   }
   public static ComplexNumber operator /(ComplexNumber n1, ComplexNumber n2)
   {
       double n2Norm = n2.Re * n2.Re + n2.Im * n2.Im;
       return new ComplexNumber((n1.Re * n2.Re + n1.Im * n2.Im) / n2Norm,
           (n1.Im * n2.Re - n1.Re * n2.Im) / n2Norm);
   }
   public static ComplexNumber operator /(ComplexNumber n1, double n2)
   {
       return new ComplexNumber(n1.Re / n2, n1.Im / n2);
   }
   public static ComplexNumber operator +(ComplexNumber n1, ComplexNumber n2)
   {
       return new ComplexNumber(n1.Re + n2.Re, n1.Im + n2.Im);
   }
   public static ComplexNumber operator -(ComplexNumber n1, ComplexNumber n2)
   {
       return new ComplexNumber(n1.Re - n2.Re, n1.Im - n2.Im);
   }
   public static ComplexNumber operator -(ComplexNumber n)
   {
       return new ComplexNumber(-n.Re, -n.Im);
   }
   public static implicit operator ComplexNumber(double n)
   {
       return new ComplexNumber(n, 0.0);
   }
   public static explicit operator double(ComplexNumber n)
   {
       return n.Re;
   }
   public static bool operator ==(ComplexNumber n1, ComplexNumber n2)
   {
       return n1.Re == n2.Re && n1.Im == n2.Im;
   }
   public static bool operator !=(ComplexNumber n1, ComplexNumber n2)
   {
       return n1.Re != n2.Re || n1.Im != n2.Im;
   }
   public override bool Equals(object obj)
   {
       return this == (ComplexNumber)obj;
   }
   public override int GetHashCode()
   {
       return Re.GetHashCode() ^ Im.GetHashCode();
   }
   public override string ToString()
   {
       return String.Format("{0}+{1}*i", Re, Im);
   }

}

public static class ComplexMath {

   public static double Abs(ComplexNumber a)
   {
       return Math.Sqrt(Norm(a));
   }
   public static double Norm(ComplexNumber a)
   {
       return a.Re * a.Re + a.Im * a.Im;
   }
   public static double Arg(ComplexNumber a)
   {
       return Math.Atan2(a.Im, a.Re);
   }
   public static ComplexNumber Inverse(ComplexNumber a)
   {
       double norm = Norm(a);
       return new ComplexNumber(a.Re / norm, -a.Im / norm);
   }
   public static ComplexNumber Conjugate(ComplexNumber a)
   {
       return new ComplexNumber(a.Re, -a.Im);
   }
   public static ComplexNumber Exp(ComplexNumber a)
   {
       double e = Math.Exp(a.Re);
       return new ComplexNumber(e * Math.Cos(a.Im), e * Math.Sin(a.Im));
   }
   public static ComplexNumber Log(ComplexNumber a)
   {
       return new ComplexNumber(0.5 * Math.Log(Norm(a)), Arg(a));
   }
   public static ComplexNumber Power(ComplexNumber a, ComplexNumber power)
   {
       return Exp(power * Log(a));
   }
   public static ComplexNumber Power(ComplexNumber a, int power)
   {
       bool inverse = false;
       if (power < 0)
       {
           inverse = true; power = -power;
       }
       ComplexNumber result = 1.0;
       ComplexNumber multiplier = a;
       while (power > 0)
       {
           if ((power & 1) != 0) result *= multiplier;
           multiplier *= multiplier;
           power >>= 1;
       }
       if (inverse)
           return Inverse(result);
       else
           return result;
   }
   public static ComplexNumber Sqrt(ComplexNumber a)
   {
       return Exp(0.5 * Log(a));
   }
   public static ComplexNumber Sin(ComplexNumber a)
   {
       return Sinh(ComplexNumber.i * a) / ComplexNumber.i;
   }
   public static ComplexNumber Cos(ComplexNumber a)
   {
       return Cosh(ComplexNumber.i * a);
   }
   public static ComplexNumber Sinh(ComplexNumber a)
   {
       return 0.5 * (Exp(a) - Exp(-a));
   }
   public static ComplexNumber Cosh(ComplexNumber a)
   {
       return 0.5 * (Exp(a) + Exp(-a));
   }

}

class Program {

   static void Main(string[] args)
   {
       // usage
       ComplexNumber i = 2;
       ComplexNumber j = new ComplexNumber(1, -2);
       Console.WriteLine(i * j);
       Console.WriteLine(ComplexMath.Power(j, 2));
       Console.WriteLine((double)ComplexMath.Sin(i) + " vs " + Math.Sin(2));
       Console.WriteLine(ComplexMath.Power(j, 0) == 1.0);
   }

}</lang>

Common Lisp

Complex numbers are a built-in numeric type in Common Lisp. The literal syntax for a complex number is #C(real imaginary). The components of a complex number may be integers, ratios, or floating-point. Arithmetic operations automatically return complex (or real) numbers when appropriate:

<lang lisp>> (sqrt -1)

  1. C(0.0 1.0)

> (expt #c(0 1) 2) -1</lang>

Here are some arithmetic operations on complex numbers:

<lang lisp>> (+ #c(0 1) #c(1 0))

  1. C(1 1)

> (* #c(1 1) 2)

  1. C(2 2)

> (* #c(1 1) #c(0 2))

  1. C(-2 2)

> (- #c(1 1))

  1. C(-1 -1)

> (/ #c(0 2))

  1. C(0 -1/2)</lang>

Complex numbers can be constructed from real and imaginary parts using the complex function, and taken apart using the realpart and imagpart functions.

<lang lisp>> (complex 64 (/ 3 4))

  1. C(64 3/4)

> (realpart #c(5 5)) 5

> (imagpart (complex 0 pi)) 3.141592653589793d0</lang>

D

Complex number is a D built-in type. <lang d>auto x = 1F+1i ; // auto type to cfloat auto y = 3.14159+1.2i ; // cdouble creal z ;

// addition z = x + y ; writefln(z) ; // => 4.14159+2.2i // multiplication z = x * y ; writefln(z) ; // => 1.94159+4.34159i // inversion z = 1.0 / x ; writefln(z) ; // => 0.5+-0.5i // negation z = -x ; writefln(z) ; // => -1+-1i</lang>

Forth

There is no standard syntax or mechanism for complex numbers. The FSL provides several implementations suitable for different uses. This example uses the existing floating point stack, but other libraries define a separate complex stack and/or a fixed-point implementation suitable for microcontrollers and DSPs.

<lang forth>include complex.seq

ZNEGATE ( r i -- -r -i ) fswap fnegate fswap fnegate ;

zvariable x zvariable y 1e 1e x z! pi 1.2e y z!

x z@ y z@ z+ z. x z@ y z@ z* z. 1+0i x z@ z/ z. x z@ znegate z.</lang>

Fortran

In ANSI FORTRAN 66 or later, COMPLEX is a built-in data type with full access to intrinsic arithmetic operations. Putting each native operation in a function is horribly inefficient, so I will simply demonstrate the operations. This example shows usage for Fortran 90 or later: <lang fortran>program cdemo

   complex :: a = (5,3), b = (0.5, 6.0)      ! complex initializer
   complex :: absum, abprod, aneg, ainv
   
   absum  = a + b
   abprod = a * b
   aneg   = -a
   ainv   = 1.0 / a

end program cdemo</lang>

And, although you did not ask, here are demonstrations of some other common complex number operations <lang fortran>program cdemo2

   complex :: a = (5,3), b = (0.5, 6)        ! complex initializer
   real, parameter :: pi = 3.141592653589793 ! The constant "pi"
   complex, parameter :: i = (0, 1)          ! the imaginary unit "i" (sqrt(-1))
   complex :: abdiff, abquot, abpow, aconj, p2cart, newc
   real :: areal, aimag, anorm, rho = 10, theta = pi / 3.0, x = 2.3, y = 3.0
   integer, parameter :: n = 50
   integer :: j
   complex, dimension(0:n-1) :: unit_circle
   
   abdiff = a - b
   abquot = a / b
   abpow  = a ** b
   areal = real(a)               ! Real part
   aimag = imag(a)               ! Imaginary part
   newc = cmplx(x,y)             ! Creating a complex on the fly from two reals intrinsically
                                 !   (initializer only works in declarations)
   newc = x + y*i                ! Creating a complex on the fly from two reals arithmetically
   anorm = abs(a)                ! Complex norm (or "modulus" or "absolute value")
                                 !   (use CABS before Fortran 90)
   aconj = conjg(a)              ! Complex conjugate (same as real(a) - i*imag(a))
   p2cart = rho * exp(i * theta) ! Euler's polar complex notation to cartesian complex notation
                                 !   conversion (use CEXP before Fortran 90)

   ! The following creates an array of N evenly spaced points around the complex unit circle
   ! useful for FFT calculations, among other things
   unit_circle = exp(2*i*pi/n * (/ (j, j=0, n-1) /) ) 

end program cdemo2</lang>

Groovy

Groovy does not provide any built-in facility for complex arithmetic. However, it does support arithmetic operator overloading. Thus it is not too hard to build a fairly robust, complete, and intuitive complex number class, such as the following: <lang groovy>class Complex {

   final Number real, imag
   
   static final Complex I = [0,1] as Complex
   
   Complex(Number real) { this(real, 0) }
   
   Complex(real, imag) { this.real = real; this.imag = imag }
   
   Complex plus (Complex c) { [real + c.real, imag + c.imag] as Complex }
   
   Complex plus (Number n) { [real + n, imag] as Complex }
   
   Complex minus (Complex c) { [real - c.real, imag - c.imag] as Complex }
   
   Complex minus (Number n) { [real - n, imag] as Complex }
   
   Complex multiply (Complex c) { [real*c.real - imag*c.imag , imag*c.real + real*c.imag] as Complex }
   
   Complex multiply (Number n) { [real*n , imag*n] as Complex }
   
   Complex div (Complex c) { this * c.recip() }
   
   Complex div (Number n) { this * (1/n) }
   
   Complex negative () { [-real, -imag] as Complex }
   
   /** the complex conjugate of this complex number.
     * Overloads the bitwise complement (~) operator. */
   Complex bitwiseNegate () { [real, -imag] as Complex }
   
   /** the magnitude of this complex number. */
  // could also use Math.sqrt( (this * (~this)).real )
   Number abs () { Math.sqrt( real*real + imag*imag ) }
   
   /** the complex reciprocal of this complex number. */
   Complex recip() { (~this) / ((this * (~this)).real) }
   
   /** derived angle θ (theta) for polar form.
     * Normalized to 0 ≤ θ < 2π. */
   Number getTheta() {
       def theta = Math.atan2(imag,real)
       theta = theta < 0 ? theta + 2 * Math.PI : theta
   }
   
   /** derived magnitude ρ (rho) for polar form. */
   Number getRho() { this.abs() }
   
   /** Runs Euler's polar-to-Cartesian complex conversion,
     * converting [ρ, θ] inputs into a [real, imag]-based complex number */
   static Complex fromPolar(Number rho, Number theta) {
       [rho * Math.cos(theta), rho * Math.sin(theta)] as Complex
   }
   
   /** Creates new complex with same magnitude ρ, but different angle θ */
   Complex withTheta(Number theta) { fromPolar(this.rho, theta) }
   
   /** Creates new complex with same angle θ, but different magnitude ρ */
   Complex withRho(Number rho) { fromPolar(rho, this.theta) }
   
   static Complex exp(Complex c) { fromPolar(Math.exp(c.real), c.imag) }
   
   static Complex log(Complex c) { [Math.log(c.rho), c.theta] as Complex }
   
   Complex power(Complex c) {
       this == 0 && c != 0  \
               ?  [0] as Complex  \
               :  c == 1  \
                       ?  this  \
                       :  exp( log(this) * c )
   }
   
   Complex power(Number n) { this ** ([n, 0] as Complex) }
   
   boolean equals(other) {
       other != null && (other instanceof Complex \
                               ? [real, imag] == [other.real, other.imag] \
                               : other instanceof Number && [real, imag] == [other, 0])
   }
   
   int hashCode() { [real, imag].hashCode() }
   
   String toString() {
       def realPart = "${real}"
       def imagPart = imag.abs() == 1 ? "i" : "${imag.abs()}i"
       real == 0 && imag == 0 \
               ? "0" \
               : real == 0 \
                       ? (imag > 0 ?  : "-")  + imagPart \
                       : imag == 0 \
                               ? realPart \
                               : realPart + (imag > 0 ? " + " : " - ")  + imagPart
   }

}</lang> Javadoc on the polar-related methods uses the following Greek alphabet encoded entities: &#x03C1;: ρ (rho), &#x03B8;: θ (theta), and &#x03C0;: π (pi).

Test Program (patterned after the Fortran example): <lang groovy>def tol = 0.000000001 // tolerance: acceptable "wrongness" to account for rounding error

println 'Demo 1: functionality as requested' def a = [5,3] as Complex println 'a == ' + a def b = [0.5,6] as Complex println 'b == ' + b

println "a + b == (${a}) + (${b}) == " + (a + b) println "a * b == (${a}) * (${b}) == " + (a * b) assert a + (-a) == 0 println "-a == -(${a}) == " + (-a) assert (a * a.recip() - 1).abs() < tol println "1/a == (${a}).recip() == " + (a.recip()) println()

println 'Demo 2: other functionality not requested, but important for completeness' println "a - b == (${a}) - (${b}) == " + (a - b) println "a / b == (${a}) / (${b}) == " + (a / b) println "a ** b == (${a}) ** (${b}) == " + (a ** b) println 'a.real == ' + a.real println 'a.imag == ' + a.imag println 'a.rho == ' + a.rho println 'a.theta == ' + a.theta println '|a| == ' + a.abs() println 'a_bar == ' + ~a

def rho = 10 def piOverTheta = 3 def theta = Math.PI / piOverTheta def fromPolar1 = Complex.fromPolar(rho, theta) // direct polar-to-cartesian conversion def fromPolar2 = Complex.exp(Complex.I * theta) * rho // Euler's equation println "rho*cos(theta) + rho*i*sin(theta) == ${rho}*cos(pi/${piOverTheta}) + ${rho}*i*sin(pi/${piOverTheta}) == " + fromPolar1 println "rho * exp(i * theta) == ${rho} * exp(i * pi/${piOverTheta}) == " + fromPolar2 assert (fromPolar1 - fromPolar2).abs() < tol println()</lang>

Output:

Demo 1: functionality as requested
a == 5 + 3i
b == 0.5 + 6i
a + b == (5 + 3i) + (0.5 + 6i) == 5.5 + 9i
a * b == (5 + 3i) * (0.5 + 6i) == -15.5 + 31.5i
-a == -(5 + 3i) == -5 - 3i
1/a == (5 + 3i).recip() == 0.1470588235 - 0.0882352941i

Demo 2: other functionality not requested, but important for completeness
a - b == (5 + 3i) - (0.5 + 6i) == 4.5 - 3i
a / b == (5 + 3i) / (0.5 + 6i) == 0.56551724145 - 0.78620689665i
a ** b == (5 + 3i) ** (0.5 + 6i) == -0.013750112198456855 - 0.09332524760169053i
a.real == 5
a.imag == 3
a.rho == 5.830951894845301
a.theta == 0.5404195002705842
|a| == 5.830951894845301
a_bar == 5 - 3i
rho*cos(theta) +  rho*i*sin(theta) == 10*cos(pi/3) +  10*i*sin(pi/3) == 5.000000000000001 + 8.660254037844386i
rho * exp(i * theta) == 10 * exp(i * pi/3) == 5.000000000000001 + 8.660254037844386i

A Groovy equivalent to the "unit circle" part of the Fortran demo is shown in the Roots of unity task.

Haskell

Complex numbers are parameterized in their base type, so you can have Complex Integer for the Gaussian Integers, Complex Float, Complex Double, etc. The operations are just the usual overloaded numeric operations.

<lang haskell>import Data.Complex

main = do

 let a = 1.0 :+ 2.0    -- complex number 1+2i
 let b = fromInteger 4 -- complex number 4+0i
 putStrLn $ "Add:      " ++ show (a + b)
 putStrLn $ "Subtract: " ++ show (a - b)
 putStrLn $ "Multiply: " ++ show (a * b)
 putStrLn $ "Divide:   " ++ show (a / b)
 putStrLn $ "Negate:   " ++ show (-a)
 putStrLn $ "Inverse:  " ++ show (recip a)</lang>

Output:

<lang haskell>*Main> main Add: 5.0 :+ 2.0 Subtract: (-3.0) :+ 2.0 Multiply: 4.0 :+ 8.0 Divide: 0.25 :+ 0.5 Negate: (-1.0) :+ (-2.0) Inverse: 0.2 :+ (-0.4)</lang>

IDL

complex (and dcomplex for double-precision) is a built-in data type in IDL:

<lang idl>x=complex(1,1)

y=complex(!pi,1.2)
print,x+y

( 4.14159, 2.20000)

print,x*y

( 1.94159, 4.34159)

print,-x

( -1.00000, -1.00000)

print,1/x

( 0.500000, -0.500000)</lang>

J

Complex numbers are a native numeric data type in J. Although the examples shown here are performed on scalars, all numeric operations naturally apply to arrays of complex numbers. <lang j> x=: 1j1

  y=: 3.14159j1.2
  x+y

4.14159j2.2

  x*y

1.94159j4.34159

  %x

0.5j_0.5

  -x

_1j_1</lang>

Java

<lang java>public class Complex{

  public final double real;
  public final double imag;
  public Complex(){this(0,0)}//default values to 0...force of habit
  public Complex(double r, double i){real = r; imag = i;}
  public Complex add(Complex b){
     return new Complex(this.real + b.real, this.imag + b.imag);
  }
  public Complex mult(Complex b){
     //FOIL of (a+bi)(c+di) with i*i = -1
     return new Complex(this.real * b.real - this.imag * b.imag, this.real * b.imag + this.imag * b.real);
  }
  public Complex inv(){
     //1/(a+bi) * (a-bi)/(a-bi) = 1/(a+bi) but it's more workable
     double denom = real * real + imag * imag;
     return new Complex(real/denom,-imag/denom);
  }
  public Complex neg(){
     return new Complex(-real, -imag);
  }
  public String toString(){ //override Object's toString
     return real + " + " + imag + " * i";
  }
  public static void main(String[] args){
     Complex a = new Complex(Math.PI, -5) //just some numbers
     Complex b = new Complex(-1, 2.5);
     System.out.println(a.neg());
     System.out.println(a.add(b));
     System.out.println(a.inv());
     System.out.println(a.mult(b));
  }

}</lang>

JavaScript

<lang javascript>function Complex ( r, i ){ this.r = r; this.i = i; }

Complex.add = function (){ var num = arguments[0];

for( var i = 1, ilim = arguments.length; i < ilim; i += 1 ){ num.r += arguments[i].r; num.i += arguments[i].i; }

return num; }

Complex.multiply = function (){ var num = arguments[0];

for( var i = 1, ilim = arguments.length; i < ilim; i += 1 ){ num.r = ( num.r * arguments[i].r ) - ( num.i * arguments[i].i ); num.i = ( num.i * arguments[i].r ) - ( num.r * arguments[i].i ); }

return num; }

Complex.negate = function ( z ){ return new Complex ( -1*z.r , -1*z.i ); }

Complex.invert = function ( z ){ var denom = Math.pow(z.r,2) + Math.pow(z.i,2); return new Complex ( z.r/denom , -1*z.i/denom ); }

// BONUSES!


Complex.prototype.toString = function(){ return (this.r !== 0 ? this.r : "") + (this.r !== 0 && this.i !== 0 ? (this.i > 0 ? " + " : " - ") : "" ) + ( this.i !== 0 ? Math.abs(this.i) + "i" : "" ); }

Complex.prototype.getMod = function ( ){ return Math.sqrt( Math.pow(this.r,2) , Math.pow(this.i,2) ) }</lang>

Maple

Maple has "I" (the square root of -1) built-in. Thus:

<lang maple>x := 1+I; y := Pi+I*1.2;</lang>

By itself, it will perform mathematical operations symbolically, i.e. it will not try to perform computational evaluation unless specifically asked to do so. Thus:

<lang maple>x*y;

   ==> (1 + I) (Pi + 1.2 I)

simplify(x*y);

   ==> 1.941592654 + 4.341592654 I</lang>

Other than that, the task merely asks for

<lang maple>x+y; x*y; -x; 1/x;</lang>

Mathematica

Mathematica has fully implemented support for complex numbers throughout the software. Addition, subtraction, division, multiplications and powering need no further syntax than for real numbers: <lang Mathematica>x=1+2I y=3+4I

x+y => 4 + 6 I x-y => -2 - 2 I y x => -5 + 10 I y/x => 11/5 - (2 I)/5 x^3 => -11 - 2 I y^4 => -527 - 336 I x^y => (1 + 2 I)^(3 + 4 I) N[x^y] => 0.12901 + 0.0339241 I</lang> Powering to a complex power can in general not be written shorter, so Mathematica leaves it unevaluated if the numbers are exact. An approximation can be acquired using the function N. However Mathematica goes much further, basically all functions can handle complex numbers to arbitrary precision, including (but not limited to!): <lang Mathematica>Exp Log Sin Cos Tan Csc Sec Cot ArcSin ArcCos ArcTan ArcCsc ArcSec ArcCot Sinh Cosh Tanh Csch Sech Coth ArcSinh ArcCosh ArcTanh ArcCsch ArcSech ArcCoth Sinc Haversine InverseHaversine Factorial Gamma PolyGamma LogGamma Erf BarnesG Hyperfactorial Zeta ProductLog RamanujanTauL</lang> and many many more. The documentation states:

Mathematica has fundamental support for both explicit complex numbers and symbolic complex variables. All applicable mathematical functions support arbitrary-precision evaluation for complex values of all parameters, and symbolic operations automatically treat complex variables with full generality.

OCaml

The Complex module from the standard library provides the functionality of complex numbers: <lang ocaml>open Complex

let print_complex z =

 Printf.printf "%f + %f i\n" z.re z.im

let () =

 let a = { re = 1.0; im = 1.0 }
 and b = { re = 3.14159; im = 1.25 } in
   print_complex (add a b);
   print_complex (mul a b);
   print_complex (inv a);
   print_complex (neg a)</lang>

Octave

GNU Octave handles naturally complex numbers: <lang octave>z1 = 1.5 + 3i; z2 = 1.5 + 1.5i; disp(z1 + z2);  % 3.0 + 4.5i disp(z1 - z2);  % 0.0 + 1.5i disp(z1 * z2);  % -2.25 + 6.75i disp(z1 / z2);  % 1.5 + 0.5i disp(-z1);  % -1.5 - 3i disp(z1');  % 1.5 - 3i disp(abs(z1));  % 3.3541 = sqrt(z1*z1') disp(z1 ^ z2);  % -1.10248 - 0.38306i disp( exp(z1) );  % -4.43684 + 0.63246i disp( imag(z1) ); % 3 disp( real(z2) ); % 1.5 %...</lang>

Pascal

<lang pascal>program showcomplex(output);

type

complex = record
           re,im: real
          end;

var

z1, z2, zr: complex;

procedure set(var result: complex; re, im: real);

begin
 result.re := re;
 result.im := im
end;

procedure print(a: complex);

begin
 write('(', a.re , ',', a.im, ')')
end;

procedure add(var result: complex; a, b: complex);

begin
 result.re := a.re + b.re;
 result.im := a.im + b.im;
end;

procedure neg(var result: complex; a: complex);

begin
 result.re := -a.re;
 result.im := -a.im
end;

procedure mult(var result: complex; a, b: complex);

begin
 result.re := a.re*b.re - a.im*b.im;
 result.im := a.re*b.im + a.im*b.re
end;

procedure inv(var result: complex; a: complex);

var
 anorm: real;
begin
 anorm := a.re*a.re + a.im*a.im;
 result.re := a.re/anorm;
 result.im := -a.im/anorm
end;

begin

set(z1, 3, 4);
set(z2, 5, 6);
neg(zr, z1);
print(zr); { prints (-3,-4) }
writeln;
add(zr, z1, z2);
print(zr); { prints (8,10) }
writeln;
inv(zr, z1);
print(zr); { prints (0.12,-0.16) }
writeln;
mul(zr, z1, z2);
print(zr); { prints (-9,38) }
writeln

end.</lang>

Perl

The Math::Complex module provides the functionality of complex numbers. <lang perl>use Math::Complex;

$a = 1 + 1*i; $b = 3.14159 + 1.25*i;

$c = $a + $b; $c = $a * $b; $c = 1 / $a; $c = -$a;</lang>

Pop11

Complex numbers are a built-in data type in Pop11. Real and imaginary part of complex numbers can be floating point or exact (integer or rational) value (both part must be of the same type). Operations on floating point complex numbers always produce complex numbers. Operations on exact complex numbers give real result (integer or rational) if imaginary part of the result is 0. The '+:' and '-:' operators create complex numbers: '1 -: 3' is '1 - 3i' in mathematical notation.

<lang pop11>lvars a = 1.0 +: 1.0, b = 2.0 +: 5.0 ; a+b => a*b => 1/a => a-b => a-a => a/b => a/a =>

The same, but using exact values

1 +: 1 -> a; 2 +: 5 -> b; a+b => a*b => 1/a => a-b => a-a => a/b => a/a =></lang>

Python

<lang python>a = 1 + 1j b = 3.14159 + 1.25j

c = a + b c = a * b c = 1 / a c = -a</lang>

R

Translation of: Octave

<lang R>z1 <- 1.5 + 3i z2 <- 1.5 + 1.5i print(z1 + z2) # 3+4.5i print(z1 - z2) # 0+1.5i print(z1 * z2) # -2.25+6.75i print(z1 / z2) # 1.5+0.5i print(-z1) # -1.5-3i print(Conj(z1)) # 1.5-3i print(abs(z1)) # 3.354102 print(z1^z2) # -1.102483-0.383064i print(exp(z1)) # -4.436839+0.632456i print(Re(z1)) # 1.5 print(Im(z1)) # 3</lang>

Ruby

<lang ruby>require 'complex'

a = Complex(1, 1) a = 1 + 1.im # alternative method b = 3.14159 + 1.25.im

c = a + b c = a * b c = 1.0 / a c = -a</lang>

Scheme

<lang scheme>(define a (make-rectangular 1 1)) (define b (make-rectangular 3.14159 1.25))

(define c (+ a b)) (define c (* a b)) (define c (/ 1 a)) (define c (- a))</lang>

Slate

<lang slate>[| a b |

 a: 1 + 1 i.
 b: Pi + 1.2 i.
 print: a + b.
 print: a * b.
 print: a / b.
 print: a reciprocal.
 print: a conjugated.
 print: a abs.
 print: a negated.

].</lang>

Smalltalk

Works with: GNU Smalltalk

<lang smalltalk>PackageLoader fileInPackage: 'Complex'. |a b| a := 1 + 1 i. b := 3.14159 + 1.2 i. (a + b) displayNl. (a * b) displayNl. (a / b) displayNl. a reciprocal displayNl. a conjugate displayNl. a abs displayNl. a real displayNl. a imaginary displayNl. a negated displayNl.</lang>

Tcl

Using the math::complexnumbers package from

Library: tcllib

<lang tcl>package require math::complexnumbers namespace import math::complexnumbers::*

set a [complex 1 1] set b [complex 3.14159 1.2] puts [tostring [+ $a $b]] ;# ==> 4.14159+2.2i puts [tostring [* $a $b]] ;# ==> 1.94159+4.34159i puts [tostring [pow $a [complex -1 0]]] ;# ==> 0.5-0.4999999999999999i puts [tostring [- $a]] ;# ==> -1.0-i</lang>

TI-89 BASIC

TI-89 BASIC has built-in complex number support; the normal arithmetic operators + - * / are used.

Character set note: the symbol for the imaginary unit is not the normal "i" but a different character (Unicode: U+F02F "" (private use area); this character should display with the "TI Uni" font). Also, U+3013 EN DASH “”, displayed on the TI as a superscript minus, is used for the minus sign on numbers, distinct from ASCII "-" used for subtraction.

The choice of examples here is

Translation of: Common Lisp

.

<lang ti89b>■ √(–1)  ■ ^2 —1 ■  + 1 1 +  ■ (1+) * 2 2 + 2* ■ (1+) (2) —2 + 2* ■ —(1+) —1 -  ■ 1/(2) —1 -  ■ real(1 + 2) 1 ■ imag(1 + 2) 2</lang>

Complex numbers can also be entered and displayed in polar form. (This example shows input in polar form while the complex display mode is rectangular and the angle mode is radians).

<lang ti89b>■ (1∠π/4)

          √(2)/2 + √(2)/2*</lang>

Note that the parentheses around ∠ notation are required. It has a related use in vectors: (1∠π/4) is a complex number, [1,∠π/4] is a vector in two dimensions in polar notation, and [(1∠π/4)] is a complex number in a vector.

Ursala

Complex numbers are a primitive type that can be parsed in fixed or exponential formats, with either i or j notation as shown. The usual complex arithmetic and transcendental functions are callable using the syntax libname..funcname or a recognizable truncation (e.g., c..add or ..csin). Real operands are promoted to complex.

<lang Ursala>u = 3.785e+00-1.969e+00i v = 9.545e-01-3.305e+00j

  1. cast %jL

examples =

<

  complex..add (u,v),
  complex..mul (u,v),
  complex..sub (0.,u),
  complex..div (1.,v)></lang>

output:

<
   4.740e+00-5.274e+00j,
   -2.895e+00-1.439e+01j,
   3.785e+00-1.969e+00j,
   8.066e-02+2.793e-01j>