structstd.math.complex[src]

Types

Type FunctionComplex[src]

A complex number consisting of a real an imaginary part. T must be a floating-point value.

Parameters

T: type

Fields

re: T

Real part.

im: T

Imaginary part.

Functions

Functioninit[src]

pub fn init(re: T, im: T) Self

Create a new Complex number from the given real and imaginary parts.

Parameters

re: T
im: T

Source Code

Source code
pub fn init(re: T, im: T) Self {
    return Self{
        .re = re,
        .im = im,
    };
}

Functionadd[src]

pub fn add(self: Self, other: Self) Self

Returns the sum of two complex numbers.

Parameters

self: Self
other: Self

Source Code

Source code
pub fn add(self: Self, other: Self) Self {
    return Self{
        .re = self.re + other.re,
        .im = self.im + other.im,
    };
}

Functionsub[src]

pub fn sub(self: Self, other: Self) Self

Returns the subtraction of two complex numbers.

Parameters

self: Self
other: Self

Source Code

Source code
pub fn sub(self: Self, other: Self) Self {
    return Self{
        .re = self.re - other.re,
        .im = self.im - other.im,
    };
}

Functionmul[src]

pub fn mul(self: Self, other: Self) Self

Returns the product of two complex numbers.

Parameters

self: Self
other: Self

Source Code

Source code
pub fn mul(self: Self, other: Self) Self {
    return Self{
        .re = self.re * other.re - self.im * other.im,
        .im = self.im * other.re + self.re * other.im,
    };
}

Functiondiv[src]

pub fn div(self: Self, other: Self) Self

Returns the quotient of two complex numbers.

Parameters

self: Self
other: Self

Source Code

Source code
pub fn div(self: Self, other: Self) Self {
    const re_num = self.re * other.re + self.im * other.im;
    const im_num = self.im * other.re - self.re * other.im;
    const den = other.re * other.re + other.im * other.im;

    return Self{
        .re = re_num / den,
        .im = im_num / den,
    };
}

Functionconjugate[src]

pub fn conjugate(self: Self) Self

Returns the complex conjugate of a number.

Parameters

self: Self

Source Code

Source code
pub fn conjugate(self: Self) Self {
    return Self{
        .re = self.re,
        .im = -self.im,
    };
}

Functionneg[src]

pub fn neg(self: Self) Self

Returns the negation of a complex number.

Parameters

self: Self

Source Code

Source code
pub fn neg(self: Self) Self {
    return Self{
        .re = -self.re,
        .im = -self.im,
    };
}

Functionmulbyi[src]

pub fn mulbyi(self: Self) Self

Returns the product of complex number and i=sqrt(-1)

Parameters

self: Self

Source Code

Source code
pub fn mulbyi(self: Self) Self {
    return Self{
        .re = -self.im,
        .im = self.re,
    };
}

Functionreciprocal[src]

pub fn reciprocal(self: Self) Self

Returns the reciprocal of a complex number.

Parameters

self: Self

Source Code

Source code
pub fn reciprocal(self: Self) Self {
    const m = self.re * self.re + self.im * self.im;
    return Self{
        .re = self.re / m,
        .im = -self.im / m,
    };
}

Functionmagnitude[src]

pub fn magnitude(self: Self) T

Returns the magnitude of a complex number.

Parameters

self: Self

Source Code

Source code
pub fn magnitude(self: Self) T {
    return @sqrt(self.re * self.re + self.im * self.im);
}

FunctionsquaredMagnitude[src]

pub fn squaredMagnitude(self: Self) T

Parameters

self: Self

Source Code

Source code
pub fn squaredMagnitude(self: Self) T {
    return self.re * self.re + self.im * self.im;
}

Source Code

Source code
pub fn Complex(comptime T: type) type {
    return struct {
        const Self = @This();

        /// Real part.
        re: T,

        /// Imaginary part.
        im: T,

        /// Create a new Complex number from the given real and imaginary parts.
        pub fn init(re: T, im: T) Self {
            return Self{
                .re = re,
                .im = im,
            };
        }

        /// Returns the sum of two complex numbers.
        pub fn add(self: Self, other: Self) Self {
            return Self{
                .re = self.re + other.re,
                .im = self.im + other.im,
            };
        }

        /// Returns the subtraction of two complex numbers.
        pub fn sub(self: Self, other: Self) Self {
            return Self{
                .re = self.re - other.re,
                .im = self.im - other.im,
            };
        }

        /// Returns the product of two complex numbers.
        pub fn mul(self: Self, other: Self) Self {
            return Self{
                .re = self.re * other.re - self.im * other.im,
                .im = self.im * other.re + self.re * other.im,
            };
        }

        /// Returns the quotient of two complex numbers.
        pub fn div(self: Self, other: Self) Self {
            const re_num = self.re * other.re + self.im * other.im;
            const im_num = self.im * other.re - self.re * other.im;
            const den = other.re * other.re + other.im * other.im;

            return Self{
                .re = re_num / den,
                .im = im_num / den,
            };
        }

        /// Returns the complex conjugate of a number.
        pub fn conjugate(self: Self) Self {
            return Self{
                .re = self.re,
                .im = -self.im,
            };
        }

        /// Returns the negation of a complex number.
        pub fn neg(self: Self) Self {
            return Self{
                .re = -self.re,
                .im = -self.im,
            };
        }

        /// Returns the product of complex number and i=sqrt(-1)
        pub fn mulbyi(self: Self) Self {
            return Self{
                .re = -self.im,
                .im = self.re,
            };
        }

        /// Returns the reciprocal of a complex number.
        pub fn reciprocal(self: Self) Self {
            const m = self.re * self.re + self.im * self.im;
            return Self{
                .re = self.re / m,
                .im = -self.im / m,
            };
        }

        /// Returns the magnitude of a complex number.
        pub fn magnitude(self: Self) T {
            return @sqrt(self.re * self.re + self.im * self.im);
        }

        pub fn squaredMagnitude(self: Self) T {
            return self.re * self.re + self.im * self.im;
        }
    };
}

Functions

Functionabs[src]

pub fn abs(z: anytype) @TypeOf(z.re, z.im)

Returns the absolute value (modulus) of z.

Example Usage

test abs {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = abs(a);
    try testing.expectApproxEqAbs(5.8309517, c, epsilon);
}

Source Code

Source code
pub fn abs(z: anytype) @TypeOf(z.re, z.im) {
    return math.hypot(z.re, z.im);
}

Functionacosh[src]

pub fn acosh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic arc-cosine of z.

Example Usage

test acosh {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = acosh(a);

    try testing.expectApproxEqAbs(2.4529128, c.re, epsilon);
    try testing.expectApproxEqAbs(0.5469737, c.im, epsilon);
}

Source Code

Source code
pub fn acosh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const q = cmath.acos(z);

    return if (math.signbit(z.im))
        Complex(T).init(q.im, -q.re)
    else
        Complex(T).init(-q.im, q.re);
}

Functionacos[src]

pub fn acos(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the arc-cosine of z.

Example Usage

test acos {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = acos(a);

    try testing.expectApproxEqAbs(0.5469737, c.re, epsilon);
    try testing.expectApproxEqAbs(-2.4529128, c.im, epsilon);
}

Source Code

Source code
pub fn acos(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const q = cmath.asin(z);
    return Complex(T).init(@as(T, math.pi) / 2 - q.re, -q.im);
}

Functionarg[src]

pub fn arg(z: anytype) @TypeOf(z.re, z.im)

Returns the angular component (in radians) of z.

Example Usage

test arg {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = arg(a);
    try testing.expectApproxEqAbs(0.5404195, c, epsilon);
}

Source Code

Source code
pub fn arg(z: anytype) @TypeOf(z.re, z.im) {
    return math.atan2(z.im, z.re);
}

Functionasinh[src]

pub fn asinh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic arc-sine of z.

Example Usage

test asinh {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = asinh(a);

    try testing.expectApproxEqAbs(2.4598298, c.re, epsilon);
    try testing.expectApproxEqAbs(0.5339993, c.im, epsilon);
}

Source Code

Source code
pub fn asinh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const q = Complex(T).init(-z.im, z.re);
    const r = cmath.asin(q);
    return Complex(T).init(r.im, -r.re);
}

Functionasin[src]

pub fn asin(z: anytype) Complex(@TypeOf(z.re, z.im))

Example Usage

test asin {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = asin(a);

    try testing.expectApproxEqAbs(1.0238227, c.re, epsilon);
    try testing.expectApproxEqAbs(2.4529128, c.im, epsilon);
}

Source Code

Source code
pub fn asin(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const x = z.re;
    const y = z.im;

    const p = Complex(T).init(1.0 - (x - y) * (x + y), -2.0 * x * y);
    const q = Complex(T).init(-y, x);
    const r = cmath.log(q.add(cmath.sqrt(p)));

    return Complex(T).init(r.im, -r.re);
}

Functionatanh[src]

pub fn atanh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic arc-tangent of z.

Example Usage

test atanh {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = atanh(a);

    try testing.expectApproxEqAbs(0.14694665, c.re, epsilon);
    try testing.expectApproxEqAbs(1.4808695, c.im, epsilon);
}

Source Code

Source code
pub fn atanh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const q = Complex(T).init(-z.im, z.re);
    const r = cmath.atan(q);
    return Complex(T).init(r.im, -r.re);
}

Functionatan[src]

pub fn atan(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the arc-tangent of z.

Source Code

Source code
pub fn atan(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    return switch (T) {
        f32 => atan32(z),
        f64 => atan64(z),
        else => @compileError("atan not implemented for " ++ @typeName(z)),
    };
}

Functionconj[src]

pub fn conj(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the complex conjugate of z.

Example Usage

test conj {
    const a = Complex(f32).init(5, 3);
    const c = a.conjugate();

    try testing.expectEqual(5, c.re);
    try testing.expectEqual(-3, c.im);
}

Source Code

Source code
pub fn conj(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    return Complex(T).init(z.re, -z.im);
}

Functioncosh[src]

pub fn cosh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic arc-cosine of z.

Source Code

Source code
pub fn cosh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    return switch (T) {
        f32 => cosh32(z),
        f64 => cosh64(z),
        else => @compileError("cosh not implemented for " ++ @typeName(z)),
    };
}

Functioncos[src]

pub fn cos(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the cosine of z.

Example Usage

test cos {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = cos(a);

    try testing.expectApproxEqAbs(2.8558152, c.re, epsilon);
    try testing.expectApproxEqAbs(9.606383, c.im, epsilon);
}

Source Code

Source code
pub fn cos(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const p = Complex(T).init(-z.im, z.re);
    return cmath.cosh(p);
}

Functionexp[src]

pub fn exp(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns e raised to the power of z (e^z).

Source Code

Source code
pub fn exp(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);

    return switch (T) {
        f32 => exp32(z),
        f64 => exp64(z),
        else => @compileError("exp not implemented for " ++ @typeName(z)),
    };
}

Functionlog[src]

pub fn log(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the natural logarithm of z.

Example Usage

test log {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = log(a);

    try testing.expectApproxEqAbs(1.7631803, c.re, epsilon);
    try testing.expectApproxEqAbs(0.5404195, c.im, epsilon);
}

Source Code

Source code
pub fn log(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const r = cmath.abs(z);
    const phi = cmath.arg(z);

    return Complex(T).init(@log(r), phi);
}

Functionpow[src]

pub fn pow(z: anytype, s: anytype) Complex(@TypeOf(z.re, z.im, s.re, s.im))

Returns z raised to the complex power of c.

Example Usage

test pow {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const b = Complex(f32).init(2.3, -1.3);
    const c = pow(a, b);

    try testing.expectApproxEqAbs(58.049110, c.re, epsilon);
    try testing.expectApproxEqAbs(-101.003433, c.im, epsilon);
}

Source Code

Source code
pub fn pow(z: anytype, s: anytype) Complex(@TypeOf(z.re, z.im, s.re, s.im)) {
    return cmath.exp(cmath.log(z).mul(s));
}

Functionproj[src]

pub fn proj(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the projection of z onto the riemann sphere.

Example Usage

test proj {
    const a = Complex(f32).init(5, 3);
    const c = proj(a);

    try testing.expectEqual(5, c.re);
    try testing.expectEqual(3, c.im);
}

Source Code

Source code
pub fn proj(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);

    if (math.isInf(z.re) or math.isInf(z.im)) {
        return Complex(T).init(math.inf(T), math.copysign(@as(T, 0.0), z.re));
    }

    return Complex(T).init(z.re, z.im);
}

Functionsinh[src]

pub fn sinh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic sine of z.

Source Code

Source code
pub fn sinh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    return switch (T) {
        f32 => sinh32(z),
        f64 => sinh64(z),
        else => @compileError("tan not implemented for " ++ @typeName(z)),
    };
}

Functionsin[src]

pub fn sin(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the sine of z.

Example Usage

test sin {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = sin(a);

    try testing.expectApproxEqAbs(-9.654126, c.re, epsilon);
    try testing.expectApproxEqAbs(2.8416924, c.im, epsilon);
}

Source Code

Source code
pub fn sin(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const p = Complex(T).init(-z.im, z.re);
    const q = cmath.sinh(p);
    return Complex(T).init(q.im, -q.re);
}

Functionsqrt[src]

pub fn sqrt(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the square root of z. The real and imaginary parts of the result have the same sign as the imaginary part of z.

Source Code

Source code
pub fn sqrt(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);

    return switch (T) {
        f32 => sqrt32(z),
        f64 => sqrt64(z),
        else => @compileError("sqrt not implemented for " ++ @typeName(T)),
    };
}

Functiontanh[src]

pub fn tanh(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the hyperbolic tangent of z.

Source Code

Source code
pub fn tanh(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    return switch (T) {
        f32 => tanh32(z),
        f64 => tanh64(z),
        else => @compileError("tan not implemented for " ++ @typeName(z)),
    };
}

Functiontan[src]

pub fn tan(z: anytype) Complex(@TypeOf(z.re, z.im))

Returns the tangent of z.

Example Usage

test tan {
    const epsilon = math.floatEps(f32);
    const a = Complex(f32).init(5, 3);
    const c = tan(a);

    try testing.expectApproxEqAbs(-0.002708233, c.re, epsilon);
    try testing.expectApproxEqAbs(1.0041647, c.im, epsilon);
}

Source Code

Source code
pub fn tan(z: anytype) Complex(@TypeOf(z.re, z.im)) {
    const T = @TypeOf(z.re, z.im);
    const q = Complex(T).init(-z.im, z.re);
    const r = cmath.tanh(q);
    return Complex(T).init(r.im, -r.re);
}

Source Code

Source code
const std = @import("../std.zig");
const testing = std.testing;
const math = std.math;

pub const abs = @import("complex/abs.zig").abs;
pub const acosh = @import("complex/acosh.zig").acosh;
pub const acos = @import("complex/acos.zig").acos;
pub const arg = @import("complex/arg.zig").arg;
pub const asinh = @import("complex/asinh.zig").asinh;
pub const asin = @import("complex/asin.zig").asin;
pub const atanh = @import("complex/atanh.zig").atanh;
pub const atan = @import("complex/atan.zig").atan;
pub const conj = @import("complex/conj.zig").conj;
pub const cosh = @import("complex/cosh.zig").cosh;
pub const cos = @import("complex/cos.zig").cos;
pub const exp = @import("complex/exp.zig").exp;
pub const log = @import("complex/log.zig").log;
pub const pow = @import("complex/pow.zig").pow;
pub const proj = @import("complex/proj.zig").proj;
pub const sinh = @import("complex/sinh.zig").sinh;
pub const sin = @import("complex/sin.zig").sin;
pub const sqrt = @import("complex/sqrt.zig").sqrt;
pub const tanh = @import("complex/tanh.zig").tanh;
pub const tan = @import("complex/tan.zig").tan;

/// A complex number consisting of a real an imaginary part. T must be a floating-point value.
pub fn Complex(comptime T: type) type {
    return struct {
        const Self = @This();

        /// Real part.
        re: T,

        /// Imaginary part.
        im: T,

        /// Create a new Complex number from the given real and imaginary parts.
        pub fn init(re: T, im: T) Self {
            return Self{
                .re = re,
                .im = im,
            };
        }

        /// Returns the sum of two complex numbers.
        pub fn add(self: Self, other: Self) Self {
            return Self{
                .re = self.re + other.re,
                .im = self.im + other.im,
            };
        }

        /// Returns the subtraction of two complex numbers.
        pub fn sub(self: Self, other: Self) Self {
            return Self{
                .re = self.re - other.re,
                .im = self.im - other.im,
            };
        }

        /// Returns the product of two complex numbers.
        pub fn mul(self: Self, other: Self) Self {
            return Self{
                .re = self.re * other.re - self.im * other.im,
                .im = self.im * other.re + self.re * other.im,
            };
        }

        /// Returns the quotient of two complex numbers.
        pub fn div(self: Self, other: Self) Self {
            const re_num = self.re * other.re + self.im * other.im;
            const im_num = self.im * other.re - self.re * other.im;
            const den = other.re * other.re + other.im * other.im;

            return Self{
                .re = re_num / den,
                .im = im_num / den,
            };
        }

        /// Returns the complex conjugate of a number.
        pub fn conjugate(self: Self) Self {
            return Self{
                .re = self.re,
                .im = -self.im,
            };
        }

        /// Returns the negation of a complex number.
        pub fn neg(self: Self) Self {
            return Self{
                .re = -self.re,
                .im = -self.im,
            };
        }

        /// Returns the product of complex number and i=sqrt(-1)
        pub fn mulbyi(self: Self) Self {
            return Self{
                .re = -self.im,
                .im = self.re,
            };
        }

        /// Returns the reciprocal of a complex number.
        pub fn reciprocal(self: Self) Self {
            const m = self.re * self.re + self.im * self.im;
            return Self{
                .re = self.re / m,
                .im = -self.im / m,
            };
        }

        /// Returns the magnitude of a complex number.
        pub fn magnitude(self: Self) T {
            return @sqrt(self.re * self.re + self.im * self.im);
        }

        pub fn squaredMagnitude(self: Self) T {
            return self.re * self.re + self.im * self.im;
        }
    };
}

const epsilon = 0.0001;

test "add" {
    const a = Complex(f32).init(5, 3);
    const b = Complex(f32).init(2, 7);
    const c = a.add(b);

    try testing.expect(c.re == 7 and c.im == 10);
}

test "sub" {
    const a = Complex(f32).init(5, 3);
    const b = Complex(f32).init(2, 7);
    const c = a.sub(b);

    try testing.expect(c.re == 3 and c.im == -4);
}

test "mul" {
    const a = Complex(f32).init(5, 3);
    const b = Complex(f32).init(2, 7);
    const c = a.mul(b);

    try testing.expect(c.re == -11 and c.im == 41);
}

test "div" {
    const a = Complex(f32).init(5, 3);
    const b = Complex(f32).init(2, 7);
    const c = a.div(b);

    try testing.expect(math.approxEqAbs(f32, c.re, @as(f32, 31) / 53, epsilon) and
        math.approxEqAbs(f32, c.im, @as(f32, -29) / 53, epsilon));
}

test "conjugate" {
    const a = Complex(f32).init(5, 3);
    const c = a.conjugate();

    try testing.expect(c.re == 5 and c.im == -3);
}

test "neg" {
    const a = Complex(f32).init(5, 3);
    const c = a.neg();

    try testing.expect(c.re == -5 and c.im == -3);
}

test "mulbyi" {
    const a = Complex(f32).init(5, 3);
    const c = a.mulbyi();

    try testing.expect(c.re == -3 and c.im == 5);
}

test "reciprocal" {
    const a = Complex(f32).init(5, 3);
    const c = a.reciprocal();

    try testing.expect(math.approxEqAbs(f32, c.re, @as(f32, 5) / 34, epsilon) and
        math.approxEqAbs(f32, c.im, @as(f32, -3) / 34, epsilon));
}

test "magnitude" {
    const a = Complex(f32).init(5, 3);
    const c = a.magnitude();

    try testing.expect(math.approxEqAbs(f32, c, 5.83095, epsilon));
}

test "squaredMagnitude" {
    const a = Complex(f32).init(5, 3);
    const c = a.squaredMagnitude();

    try testing.expect(math.approxEqAbs(f32, c, math.pow(f32, a.magnitude(), 2), epsilon));
}

test {
    _ = @import("complex/abs.zig");
    _ = @import("complex/acosh.zig");
    _ = @import("complex/acos.zig");
    _ = @import("complex/arg.zig");
    _ = @import("complex/asinh.zig");
    _ = @import("complex/asin.zig");
    _ = @import("complex/atanh.zig");
    _ = @import("complex/atan.zig");
    _ = @import("complex/conj.zig");
    _ = @import("complex/cosh.zig");
    _ = @import("complex/cos.zig");
    _ = @import("complex/exp.zig");
    _ = @import("complex/log.zig");
    _ = @import("complex/pow.zig");
    _ = @import("complex/proj.zig");
    _ = @import("complex/sinh.zig");
    _ = @import("complex/sin.zig");
    _ = @import("complex/sqrt.zig");
    _ = @import("complex/tanh.zig");
    _ = @import("complex/tan.zig");
}