Skip to content

dew-complex ​

Complex number support for dew expressions. Useful for signal processing, 2D rotations, and general complex arithmetic.

Installation ​

toml
[dependencies]
dew-core = "0.1"
dew-complex = "0.1"

# Enable backends as needed
dew-complex = { version = "0.1", features = ["wgsl", "glsl", "lua", "cranelift"] }

Basic Usage ​

rust
use dew_core::Expr;
use dew_complex::{Value, eval, complex_registry};
use std::collections::HashMap;

// Parse an expression
let expr = Expr::parse("a * b").unwrap();

// Set up complex variables
let mut vars: HashMap<String, Value<f32>> = HashMap::new();
vars.insert("a".to_string(), Value::Complex([1.0, 2.0]));  // 1 + 2i
vars.insert("b".to_string(), Value::Complex([3.0, 4.0]));  // 3 + 4i

// Evaluate
let registry = complex_registry();
let result = eval(expr.ast(), &vars, &registry).unwrap();
// (1+2i)(3+4i) = -5 + 10i
assert_eq!(result, Value::Complex([-5.0, 10.0]));

Types ​

Value Enum ​

rust
pub enum Value<T> {
    Scalar(T),           // Real number
    Complex([T; 2]),     // [re, im]
}

Type Enum ​

rust
pub enum Type {
    Scalar,
    Complex,
}

Operators ​

Arithmetic ​

ExpressionResult
z + wComplex addition
z - wComplex subtraction
z * wComplex multiplication
z / wComplex division
z ^ nComplex power (scalar exponent)
-zNegation
s * zScalar-complex multiply
z * sComplex-scalar multiply

Complex Multiplication ​

For (a + bi)(c + di):

  • Real: ac - bd
  • Imag: ad + bc

Complex Division ​

For (a + bi) / (c + di):

  • Multiply by conjugate: (a + bi)(c - di) / (c² + d²)

Functions ​

Component Access ​

FunctionDescriptionResult
re(z)Real partScalar
im(z)Imaginary partScalar

Properties ​

FunctionDescriptionResult
abs(z)Magnitude |z| = √(a² + b²)Scalar
arg(z)Phase angle atan2(b, a)Scalar
norm(z)Squared magnitude a² + b²Scalar
conj(z)Conjugate a - biComplex

Exponential / Logarithmic ​

FunctionDescriptionResult
exp(z)Complex exponential e^zComplex
log(z)Complex natural logarithmComplex
sqrt(z)Complex square rootComplex
pow(z, n)Complex powerComplex

Construction ​

FunctionDescriptionResult
polar(r, theta)From polar form r·e^(iθ)Complex

Mathematical Notes ​

Euler's Formula ​

exp(a + bi) = e^a · (cos(b) + i·sin(b))

Complex Logarithm ​

log(z) = log|z| + i·arg(z)

Complex Square Root ​

sqrt(z) = sqrt(|z|) · (cos(arg(z)/2) + i·sin(arg(z)/2))

Examples ​

Complex Multiplication ​

rust
// (1 + 2i) * (3 + 4i) = -5 + 10i
let expr = Expr::parse("a * b").unwrap();
vars.insert("a".to_string(), Value::Complex([1.0, 2.0]));
vars.insert("b".to_string(), Value::Complex([3.0, 4.0]));
let result = eval(expr.ast(), &vars, &registry).unwrap();
assert_eq!(result, Value::Complex([-5.0, 10.0]));

Magnitude ​

rust
// |3 + 4i| = 5
let expr = Expr::parse("abs(z)").unwrap();
vars.insert("z".to_string(), Value::Complex([3.0, 4.0]));
let result = eval(expr.ast(), &vars, &registry).unwrap();
assert_eq!(result, Value::Scalar(5.0));

2D Rotation via Complex Multiply ​

rust
// Rotate point (1, 0) by 90 degrees
// Multiply by i = (0 + 1i)
let expr = Expr::parse("point * rotation").unwrap();
vars.insert("point".to_string(), Value::Complex([1.0, 0.0]));
vars.insert("rotation".to_string(), Value::Complex([0.0, 1.0]));  // i = 90°
let result = eval(expr.ast(), &vars, &registry).unwrap();
// result ≈ (0, 1)

Generic Numeric Types ​

Works with f32 or f64:

rust
let mut vars: HashMap<String, Value<f64>> = HashMap::new();
vars.insert("z".to_string(), Value::Complex([3.0, 4.0]));
let result: Value<f64> = eval(expr.ast(), &vars, &complex_registry()).unwrap();

Backends ​

Available backends: WGSL, GLSL, Lua, Cranelift. Enable via feature flags.