Mischung von 64-Bit-Integer mit 32-Bit-Float-Operationen

Gast #5219174
Lesenswert?

Guten Abend,

ich habe gerade einen Knobelaufgabe, bei der ich gerade nicht weiter 
weiss. Ich habe zwei Variablen a und b (beide 64 Bit signed Integer), 
deren Differenz jederzeit klein genug ist, daß sie problemlos in eine 
16-Bit-Integer-Variable passt, also auch problemlos in eine 32 Bit 
float-Variable. Sie wird auch als float weiterverarbeitet.

Allerdings will ich vor der Differenzbildung den Zweig a mit einem IIR 
1. Ordnung leicht filtern. Das Filter ist als float implementiert. Zweig 
b darf keinesfalls gefiltert werden. Durch die Filterung wird die 
Differenz der beiden Variablen tendenziell eher kleiner - zur 
Mantissengröße im 32-Bit-float habe ich weiterhin mehr als genügend 
Sicherheitsabstand.

Das Ganze will ich möglichst effizient für einem ARM Cortex M4 
implementieren. Die Variablen a und b passen zwar jeweils in die 
52-Bit-Mantisse einer double-Variable, aber das wäre sozusagen die 
letzte Lösung. Mein Gefühl sagt mir, daß es eine relativ einfache 
Möglichkeit geben muss, den gefilterten und den ungefilterten Zweig in 
einen großen Integer- und einen kleinen Float-Teil aufzuspalten.

Wer hilf mir, den gordischen Knoten zu zerschlagen?

Viele Grüße
W.T.
Angehängte Dateien:
Gast #5219186
Lesenswert?

Was hindert Dich, die (Ziel-) Formeln hinzuschreiben? Mit Grenzen 
etwaiger Parameter und Eingangswerte. So rate ich rum, was ein Faktor k 
zwischen 0 und 1 wohl bedeuten mag, für Auslösung und Genauigkeit...
#5219219
Lesenswert?

Das Blockdiagramm ausgeschrieben sieht so aus:
mit
Da K und omega float-Variablen sind, sind also fast alle Terme gemischte 
Multiplikationen aus 64-Bit-Integer und 32-Bit-Float.
Gast #5219546
Lesenswert?

Walter Tarpan schrieb:
> Das Ganze will ich möglichst effizient für einem ARM Cortex M4
> implementieren. Die Variablen a und b passen zwar jeweils in die
> 52-Bit-Mantisse einer double-Variable, aber das wäre sozusagen die
> letzte Lösung.

Effizient bezüglich des Platzes oder der Rechenzeit?
Irgendwo gibt es hier Ausführungszeiten für double Grundrechenarten, die 
auf einem STM32F4.. mit 168 MHz jeweils um 1 µs (div) oder deutlich 
darunter liegen (add, sub, mul). Deine 'letzte Lösung' könnte vielleicht 
völlig ausreichen. Der Vorteil ist, im Gegensatz zu einem 
Skalierungsmonster die Formel direkt und nachvollziehbar formulieren zu 
können.
Probiere es einfach aus!
#5219560
Lesenswert?

m.n. schrieb:
> Deine 'letzte Lösung' könnte vielleicht
> völlig ausreichen. Der Vorteil ist, im Gegensatz zu einem
> Skalierungsmonster die Formel direkt und nachvollziehbar formulieren zu
> können.
> Probiere es einfach aus!

Mein Vorbehalt gegen die double-Implementierung (die ich 
selbstverständlich schon gemacht habe - schließlich ist sie der 
einfachste Weg, jede andere Lösung testen zu können) liegen an einer 
ganz anderen Stelle:

Ich handele mir damit eine neue Limitierung der Zähler ein. An allen 
anderen Stellen arbeite ich nur mit Differenzen. Momentan laufe ich 
damit noch in keine Probleme. Das kann sich aber mit der nächsten 
Änderung der Anforderungen schnell ändern.
Beitrag #5219850 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren