Improve this page Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone. Page wiki View or edit the community-maintained wiki page associated with this page.


This module contains the Complex type, which is used to represent complex numbers, along with related mathematical operations and functions.

Complex will eventually replace the built-in types cfloat, cdouble, creal, ifloat, idouble, and ireal.

Lars Tandle Kyllingstad, Don Clugston

Boost License 1.0


pure nothrow @nogc @safe auto complex(T)(T re) if (is(T : double));
pure nothrow @nogc @safe auto complex(R, I)(R re, I im) if (is(R : double) && is(I : double));
Helper function that returns a complex number with the specified real and imaginary parts.

If neither re nor im are floating-point numbers, this function returns a Complex!double. Otherwise, the return type is deduced using std.traits.CommonType!(R, I).

auto c = complex(2.0);
static assert (is(typeof(c) == Complex!double));
assert ( == 2.0);
assert ( == 0.0);

auto w = complex(2);
static assert (is(typeof(w) == Complex!double));
assert (w == c);

auto z = complex(1, 3.14L);
static assert (is(typeof(z) == Complex!real));
assert ( == 1.0L);
assert ( == 3.14L);

struct Complex(T) if (isFloatingPoint!T);
A complex number parametrised by a type T, which must be either float, double or real.

T re;
The real part of the number.

T im;
The imaginary part of the number.

const string toString();
const void toString(Char)(scope void delegate(const(Char)[]) sink, FormatSpec!Char formatSpec);
Converts the complex number to a string representation.

The second form of this function is usually not called directly; instead, it is used via std.string.format, as shown in the examples below. Supported format characters are 'e', 'f', 'g', 'a', and 's'.

See the std.format and std.string.format documentation for more information.

auto c = complex(1.2, 3.4);

// Vanilla toString formatting:
assert(c.toString() == "1.2+3.4i");

// Formatting with std.string.format specs: the precision and width
// specifiers apply to both the real and imaginary parts of the
// complex number.
import std.string : format;
assert(format("%.2f", c)  == "1.20+3.40i");
assert(format("%4.1f", c) == " 1.2+ 3.4i");

pure nothrow @nogc @safe T abs(T)(Complex!T z);
Calculates the absolute value (or modulus) of a complex number.

pure nothrow @nogc @safe T arg(T)(Complex!T z);
Calculates the argument (or phase) of a complex number.

pure nothrow @nogc @safe Complex!T conj(T)(Complex!T z);
Returns the complex conjugate of a complex number.

pure nothrow @nogc @safe Complex!(CommonType!(T, U)) fromPolar(T, U)(T modulus, U argument);
Constructs a complex number given its absolute value and argument.

pure nothrow @nogc @safe Complex!T sin(T)(Complex!T z);
pure nothrow @nogc @safe Complex!T cos(T)(Complex!T z);
Trigonometric functions.

pure nothrow @nogc @trusted Complex!real expi(real y);
Calculates cos(y) + i sin(y).

expi is included here for convenience and for easy migration of code that uses std.math.expi. Unlike std.math.expi, which uses the x87 fsincos instruction when possible, this function is no faster than calculating cos(y) and sin(y) separately.

pure nothrow @nogc @safe Complex!T sqrt(T)(Complex!T z);
Square root.