Skip to main content

Crate embedded_exp

Crate embedded_exp 

Source
Expand description

§embedded-exp

Exponentielle en virgule fixe Q15 pour systèmes embarqués.

§Caractéristiques

  • #![no_std] — aucune dépendance à la bibliothèque standard
  • Arithmétique entière pure (pas de flottants, pas de libm)
  • Compatible RP2040 (Cortex-M0+) et RP2350 (Cortex-M33)
  • Algorithme : Réduction d’intervalle + approximation polynomiale de Taylor (degré 4)
  • Temps d’exécution constant (déterministe) — idéal pour les noyaux temps réel
  • Précision < 10 ULP sur toute la plage [-1.0, 0[

§Format Q15

En Q15, un i16 représente un nombre réel dans [-1.0, 1.0[ :

valeur_réelle = valeur_i16 / 32768.0

Exemples :

  • 0 → 0.0
  • 16384 → 0.5
  • 32767 → ≈ 1.0
  • -32768 → -1.0

§Algorithme

La méthode utilise la réduction d’intervalle combinée à une approximation polynomiale de Taylor de degré 4 :

  1. Décomposition : x = n·ln(2) + r, avec n entier et r ∈ [0, ln(2)[
  2. Propriété : e^x = 2^n · e^r2^n est un simple décalage de bits
  3. Approximation : e^r ≈ 1 + r + r²/2 + r³/6 + r⁴/24,“L’implémentation utilise des multiplications par l’inverse pour éviter les divisions coûteuses

Le reste r est toujours dans [0, ln(2)[ ≈ [0, 0.693[, ce qui garantit la convergence rapide du polynôme. Toutes les multiplications restent dans les bornes i32 sans risque de débordement.

§Exemple

use embedded_exp::exp_q15;

// exp(0.0) = 1.0 → non représentable en Q15 signé → sature à i16::MAX
assert_eq!(exp_q15(0), i16::MAX);

// exp(-0.5) ≈ 0.6065 → ≈ 19874 en Q15
let res = exp_q15(-16384);
assert!((res as i32 - 19874).abs() < 10);

// exp(-1.0) doit être positif
assert!(exp_q15(-32768) > 0);

Functions§

exp_q15
Calcule l’exponentielle d’un nombre en virgule fixe Q15. Temps d’exécution constant et déterministe.