embedded-complex-f32
Nombres complexes f32 pour systèmes embarqués no_std.
Zéro dépendance C · Sans unsafe · Racine carrée via embedded-f32-sqrt
Fonctionnalités
- Arithmétique complète :
+,-,*,/(opérateurs Rust natifs) - Opérations scalaires
f32:z + 1.0,z * 2.0, etc. - Module (norme), carré de la norme, conjugué
- Puissance entière (
powi) par exponentiation rapide - Racine carrée complexe (
csqrt) - Inverse (
inv), division vérifiée (checked_div) - Gestion robuste de NaN / Infinity (IEEE 754)
DisplayetDebugviacore::fmt- Conversions
From<f32>,From<(f32, f32)>,Into<(f32, f32)>
Hors périmètre
arg(), to_polar(), from_polar(), exp(), ln() requièrent des fonctions
trigonométriques précises. Utilisez libm ou micromath selon votre target et
construisez par-dessus ce type.
Installation
[]
= "0.1.0"
Démarrage rapide
use Complex;
let a = new; // 3 + 4i
let b = new; // 1 - i
// Arithmétique de base
let sum = a + b; // 4 + 3i
let diff = a - b; // 2 + 5i
let prod = a * b; // 7 + i
let quot = a / b; // NaN + NaN·i si |b| == 0 préférer checked_div
// Module et conjugué
assert!; // |3 + 4i| = 5
assert_eq!;
// Division sûre
match a.checked_div
Référence API
Constantes
ZERO // 0 + 0i
ONE // 1 + 0i
I // 0 + 1i
Constructeurs et accesseurs
new .re // partie réelle
z.im // partie imaginaire
z.is_nan .is_infinite .is_finite
Arithmétique
// Complex op Complex
z1 + z2 z1 - z2 z1 * z2 z1 / z2
z1 += z2 z1 -= z2 z1 *= z2 z1 /= z2
// Complex op f32
z + 1.0 z - 1.0 z * 2.0 z / 2.0
// Négation
-z
Opérations algébriques
// Conjugué : re - im·i
z.conj // Norme : √(re² + im²)
z.norm // Carré de la norme : re² + im² (évite la racine carrée)
z.norm_sq // Division vérifiée
z.checked_div // Inverse : 1 / self
z.inv // Racine carrée complexe
z.csqrt // Complex::new( 9.0, 0.0).csqrt() -> Ok(3.0 + 0.0i)
// Complex::new(-1.0, 0.0).csqrt() -> Ok(0.0 + 1.0i)
// Puissance entière (n négatif autorisé)
z.powi // Complex::I.powi(4) -> Ok(1.0 + 0.0i)
// Complex::new(2.0, 0.0).powi(-1) -> Ok(0.5 + 0.0i)
Conversions
from // 3.0 + 0.0i
from // 1.0 - 2.0i
let : = z.into;
Gestion d'erreurs
use ComplexError;
match z.checked_div
Exemples
Filtre IIR (pôle complexe)
use Complex;
// Pôle fourni sous forme cartésienne par l'appelant
let pole = new;
// Un pas : y[n] = x[n] + pole * y[n-1]
Puissance entière
use Complex;
// (1 + i)^8 = 16
let z = new;
let r = z.powi.unwrap;
assert!;
assert!;
Racine carrée
use Complex;
// Vérification : s² == z
let z = new;
let s = z.csqrt.unwrap;
let back = s * s;
assert!;
assert!;
Précision numérique
Toutes les opérations reposent sur l'arithmétique IEEE 754 f32 native
aucune approximation trigonométrique n'est introduite par cette crate.
| Opération | Précision |
|---|---|
+, -, *, / |
arrondi IEEE 754 f32 |
norm, norm_sq |
arrondi IEEE 754 f32 |
csqrt |
< 1e-4 (via embedded-f32-sqrt) |
powi |
accumulation d'arrondi f32 |
no_std
#![no_std] :utilise uniquement core. Compatible avec tout target Rust
embarqué : ARM Cortex-M, RISC-V, AVR, etc. Aucun feature flag requis.
Testée sur la Waveshare 2350B
let z = new;
Donne bien z=−1+0i , ∣z∣=(−1)2+02=1 , z^2=(−1)^2=1 et sqrt = 0 + 1i
⚠️ Petit détail subtil (mais important)
Il existe 2 solutions :i et −i , La fonction csqrt choisit une convention (basée sur le signe de im) → c’est très bien
Licence
Copyright (C) 2026 Jorge Andre Castro
Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License telle que publiée par la Free Software Foundation, soit la version 2 de la licence, soit (à votre gré) n'importe quelle version ultérieure.
Ce programme est distribué dans l'espoir qu'il sera utile, mais sans aucune garantie ; sans même la garantie implicite de commercialisation ou d'adéquation à un usage particulier.
SPDX-License-Identifier: GPL-2.0-or-later https://www.gnu.org/licenses/