www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Festkomma / Festpunkt


Autor: G. B. (garyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

bei einer Bastelaktion bin ich über das vermeintlich bekannte Thema 
"Rechnen mit Festpunktzahlen" gestolpert. Etwas von dem ich meinte es 
seit Jahren zu kennen - anscheinend doch nicht.
Warum bin ich drüber gestolbert - weil ich eine "Lib" suchte für den AVR 
- wie so viele anscheinend. Zu meiner Verblüfung habe ich festgestelt, 
das es anscheinend zwei "Interpretationen" von Festkommazahlen gibt.

a) Die (mir bisher) bekannte, einfache Variante
   Man multiplizire seine Zahl mit Nachkommastellem mit einem
   Faktor 10^x und quälle sich dann durch die Berechnungen mit
   untersch. Wertebereichen ;O). Hat es aber ja auch getan!

b) Die für mich "neue", logische Variante mit "gedachtem Komma"
   Die Bits einer Binärzahl (Byte, Word, Dword) werden gemäß ihren
   Stellen vor und nach dem Komma mit einer Wertigkeit 2^n belegt
   - nix Neues.
   Aber wie auch im Dezimalsystem haben die Bits ab dem "Komma"
   negativen Exponenten. Beispiel
   Byte - 1 Bit Vorkomma, 7 Bit Nachkomma
    VK-Bit   - 2^0
    NK-Bit 1 - 2^-1 = 0.5
    NK-Bit 2 - 2^-2 = 0.25
   usw.

Beide Varianten funktionieren - aber anders.... Beispiel: Zahl mit einer 
NKstelle:
a) 0.9 *10^1 = 9 entspricht b1001
b) 0.9           entspricht b1111 -> gedachtes Komma b0.1111

addiert man nun 0.1 dazu... so wird
a) Ergebnis b1010   = d10 als 1.0 -interpretiert
b) Ergebnis b10000  = d16 also mit korrekten Überschlag in den
                          ganzzahligen Teil.

So nun meine Fragen:
1) Welches der beiden Varianten ist nun "Festkomma" im Sinne des Namens? 
2) Von was geht der Fixpunkt Befehl fmul des AVR aus?
3) Was verwendet ihr? Variante a) nutzt weniger Bits.
4) Welche Vor-/Nachteile hat a) oder b)

Hoffe mir kann geholfen werden.

Gruss,
Gary

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann Dir dazu wenig sagen, aber vielleicht wusstest Du noch nicht, 
dass die eine Variante "Q Format" genannt wird:

http://en.wikipedia.org/wiki/Q_%28number_format%29

Ich kenn eigentlich nur diese Variante und hab auch bislang daher 
ausschließlich diese verwendet.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Basis 10 wird ineffizient, weil man für Berechnungen
Korrekturen durchführen muss (a*b ist um die Skalierung zu groß,
weil die ja mit multipliziert wird und muß denmentsprechend
korrigiert werden, a/b fällt die Skalierung weg, weil sie
sich aus Zähler und Nenner wegkürzt und muss deshalb wieder
reinmultipliziert werden).
Diese Korrekturen sind im Zweiersystem schneller zu machen.

Autor: garyb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Ich kann Dir dazu wenig sagen, aber vielleicht wusstest Du noch nicht,
> dass die eine Variante "Q Format" genannt wird:
>
> http://en.wikipedia.org/wiki/Q_%28number_format%29

Danke - endlich hat das Kind (Variante B) einen Namen - ich kannte halt 
bisher nur Variante A.

Klaus Wachtler schrieb:
> Zur Basis 10 wird ineffizient, weil man für Berechnungen
> Korrekturen durchführen muss (a*b ist um die Skalierung zu groß,

Hallo Klaus das ist mir bekannt - war ja auch exemplarisch gemeint, aber 
ich
war so verblüfft weil ich von der zweiten Variante nichts wusste. Deinen 
Ansatz mit C++ habe ich auch gelesen - finde ich gut. Nur hab ich noch 
kein Gefühl ob C++ nun wirklich so viel Wasserkopft mitbringt oder 
nicht. "Früher" war das ein absolutes NoNo ... sogar bei manchen PCs ;)


Aber Vor-/Nachteile sind der beiden Verfahren sind euch anscheinend auch 
nicht bekannt? Finde die Konvertierung beim Var b) etwas aufwendiger.

Gruss, Gary

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
garyb schrieb:
> Nur hab ich noch
> kein Gefühl ob C++ nun wirklich so viel Wasserkopft mitbringt oder
> nicht.

Das habe ich in dem Beitrag ja mit einer int-Lösung verglichen.
Ich verwende hier von C++ nur templates und die geschicktere Syntax
als bei C (Operatoren überladen statt umständlicher Funktionsaufrufe).
Gegenüber Standard-C führt das zu schnellerem Code durch das inlining,
wobei der gcc das auch bei C beherrscht, wenn man es explizit 
hinschreibt.
Also in diesem Punkt Gleichstand.
Klassen und insbesondere virtuelle Methoden werden nicht verwendet,
damit auch sonst kein Nachteil durch C++.

Man hat exakt 0 Nachteil durch C++ hier; gegenüber einer halbwegs
vergleichbaren Lib in C (falls das überhaupt geht) eher Vorteile,
weil bei dem inlining viel in einer "Bibliothek" (ist ja eigentlich
nur eine Headerdatei) stehen kann, was in einem konkreten Einzelfall
gar nicht genutzt wird und dann bei C++ auch keinen Code produziert.

garyb schrieb:
> Aber Vor-/Nachteile sind der beiden Verfahren sind euch anscheinend auch
> nicht bekannt? Finde die Konvertierung beim Var b) etwas aufwendiger.

Wie gesagt gibt es einen Unterschied beim Rechenaufwand.
Binär ist nunmal natürlicher und effizienter auf jedweder Hardware
(besonders Multikationen und Divisionen mit Zweierpotenzen statt
Zehnerpotenzen).

Deine Variante a mag sinnvoll sein, um Fixkommaarithmetik begreiflich
zu machen, wenn man mit Binärsystem auf Kriegsfuß steht.
Ein Rechner steht aber eher mit der 10 im Clinch, und der muß
die Arbeit machen.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist eigentlich der Unterschied zwischen Binär und Dual?

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
binär : stammt vom den Römern ab,
dual  : von den Angelsachsen.

volker

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsch!

Die Richtige Lösung ist:
Binär baut keine Plattenspieler.

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsch!

Dual baut auch keine Plattenspieler (mehr).
Wurde 1982 aufgelöst.
http://de.wikipedia.org/wiki/Dual_%28Unternehmen%29

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe übrigens neulich noch einen echten Dual gesehen (zum
ersten Mal seit bestimmt 20 Jahren).

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Zabe schrieb:
> Dual baut auch keine Plattenspieler (mehr).

na und, deine Römer gibt es auch schon lange nicht mehr! :-)

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beides ist "Festkomma". Das eine nennt sich Binary Point Scaling, die 
Variante mit der 10 fällt in die Kategorie "Slope/Bias" Scaling und kann 
noch viel mehr als die 10 als Basis.

BPS ist i.A. schneller, aber nicht immer so flexibel.

Autor: G. B. (garyb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zurück zum Inhalt:

Klaus Wachtler schrieb:
> Deine Variante a mag sinnvoll sein, um Fixkommaarithmetik begreiflich
> zu machen, wenn man mit Binärsystem auf Kriegsfuß steht.
> Ein Rechner steht aber eher mit der 10 im Clinch, und der muß
> die Arbeit machen.

Ich war der irrigen Meinung das das Shiften von Zahlen, also sprich 
Multiplikation/Division um den Faktor 2 das Gleiche ist wie das 
Multiplizieren mit dem Faktor 10.. nur halt einem anderer Faktor mit dem 
Vorteil das es schneller geht, weil für Prozessor durch Shift einfacher.

Das stimmt so zwar aber shiftet man dann entspricht das genau der 
Variante b). Also doch nur eine "Variante".

Klaus Wachtler schrieb:
> Ich verwende hier von C++ nur templates und die geschicktere Syntax
> als bei C (Operatoren überladen statt umständlicher Funktionsaufrufe).

Ok - hatte ich so noch nicht verstanden und ehrlich gesagt hab ich den 
Code auch noch nicht ganz verstanden, eben weil die Klassen fehlten ;O)

Danke,
Gary

PS: Ich stehe mit dem Binärsystem nicht auf dem Kriegsfuss, eher mit 
einem falschen Gedankengut das ich seit Jahren abgespeichert hatte und 
deswegen blind war... Yuhu ich sehe :O)

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt immer noch Dual Plattenspieler !

http://www.alfredfehrenbacher.de/Dual/4.html

hans

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G. B. schrieb:
> Ok - hatte ich so noch nicht verstanden und ehrlich gesagt hab ich den
> Code auch noch nicht ganz verstanden, eben weil die Klassen fehlten ;O)

Naja, Klassen habe ich schon.
Genau genommen nicht eine, sondern beliebig viele - nämlich für
jede Instanz des templates eine.
Also eine Klasse fixpoint< int32_t, int32_t, 2, true >, eine
fixpoint< int32_t, int32_t, 2, false >,
eine fixpoint< int16_t, int32_t, 2, true >...


Nur: eine Klasse als solche hat erstmal überhaupt keinen
Wasserkopf im kompilierten Programm, solange man nicht welchen
einbaut.
Das ist ja das schöne an C++.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.