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
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.
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.
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
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.
Falsch! Dual baut auch keine Plattenspieler (mehr). Wurde 1982 aufgelöst. http://de.wikipedia.org/wiki/Dual_%28Unternehmen%29
Ich habe übrigens neulich noch einen echten Dual gesehen (zum ersten Mal seit bestimmt 20 Jahren).
Volker Zabe schrieb: > Dual baut auch keine Plattenspieler (mehr). na und, deine Römer gibt es auch schon lange nicht mehr! :-)
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.
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)
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++.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.