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.0Exemples :
0→ 0.016384→ 0.532767→ ≈ 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 :
- Décomposition :
x = n·ln(2) + r, avecnentier etr ∈ [0, ln(2)[ - Propriété :
e^x = 2^n · e^r→2^nest un simple décalage de bits - 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.