0 Tage Serie
cpp / expert
Snippet

Benutzerdefinierte Festkommadarstellung für eingebettete Arithmetik

In ressourcenbeschränkten Umgebungen ohne Gleitkommaeinheit (FPU) bietet die Festkomma-Arithmetik eine performante Alternative zur Fließkomma-Mathematik. Dieses Snippet verwendet einen Template-Parameter, um die Präzision (Anzahl der Nachkommastellen) zur Kompilierzeit zu definieren, was optimierte Ganzzahl-Arithmetik zur Simulation von Dezimalwerten ermöglicht.

snippet.cpp
cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template<int FractionalBits>
struct FixedPoint {
int32_t raw;
explicit constexpr FixedPoint(float val)
: raw(static_cast<int32_t>(val * (1 << FractionalBits) + (val >= 0 ? 0.5f : -0.5f))) {}
constexpr float toFloat() const {
return static_cast<float>(raw) / (1 << FractionalBits);
}
FixedPoint operator+(FixedPoint other) const {
FixedPoint res;
res.raw = this->raw + other.raw;
return res;
}
private:
FixedPoint() : raw(0) {}
};
Erklärung
1
template<int FractionalBits>
Definiert den festen Skalierungsfaktor zur Kompilierzeit für maximale Effizienz.
2
raw(static_cast<int32_t>(val * (1 << FractionalBits) ...))
Konvertiert einen Float in seine interne Ganzzahldarstellung durch Linksschieben.