Diskussion:Festkommaarithmetik

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Ist das richtig ?

F) Festkomma bedeutet nicht BCD, wie im Beispiel 10.45

A) Im ganzen Artikel ist nicht einmal von BCD die Rede.


F) Das Rechenbeispiel multipliziert mit 1000, in der Formel oben ist der Faktor 100

A) Im Text ist die Rede von 10,45 bzw 1045, in der Formel 5,0 bzw. 5000. Das sind zwei verschiedene Beispiele.


F) Man muss nicht mit 1000 multiplizieren, sondern nimmt besser 1024!

A) Nirgendwo im Text steht, dass man mit 1000 multiplizieren muss, es ist aber für die erste Erklärung am sinnvollsten, da wir nun mal meistens mit Dezimalzahlen hantieren und mit diesem Zahlensystem am besten vertraut sind. Der Trick mit Zweierpotenzen wird später erklärt.


F) Was sollen die 1024 dort im Nenner, woher kommen die?

A) Von den elementaren Formeln eines 10-Bit AD-Wandlers, auch wenn davon nicht explizit die Rede ist.


Bezug zum AD

> Wieso wird hier der AD-Wandler gebracht?

Weil das eine Standardanwendung ist! Es geht nach nicht um das Ansteuern das ADC sondern die Auswertung bzw. Darstellung des Ergebnisses.

> Ich hätte lieber eine Differenz geteilt durch ein Differenz.

???

> AD-Wandlung ist noch ein anderes Thema zumal man dort teilweise auch durch n-1 dividieren muss und nicht pauschal druch die gesamte Wortbreite.

Das ist in der Formel enthalten. Ob man nun durch 256, 255 oder X dividiert ist egal. Es ist ein BEISPIEL und das Verfahren zu demonstrieren, keine starre Vorgabe.

Spiegeln

Was soll denn das mit dem Spiegeln des Strings? Das kostet nur Rechenzeit und Programmspeicher. Ich bin SEHR dafür, das KOMPLETT unter den Tisch fallen zu lassen. Ausserdem ist im Abschnitt ITOA selbst gemacht mal wieder einiges doppelt hingeschrieben worden (bitte die Artikel vorher mal in RUHE lesen). Wie z.B.

Das wars eigentlich schon.

"Beachtet werden muss nur, dass bei dieser Methode die einzelnen Stellen in umgekehrter Reihenfolge entstehen: Die höchstwertigen Stellen kommen erst zum Schluss."

Das steht doch quasi schon unten drin.

den Stringterminator). Bei dem Verfahren wird die Zahl rückwärts berechnet. Das muss bei der Ablage im Speicher berücksichtigt werden. Im Sinne der


Und auch hier ist der Unsinn drin. RAUS DAMIT!


Runden

Eine einfachere Möglichkeit besteht darin, vor dem Nach-Rechts-Schieben eine Zahl zu addieren, im Fall von >>13 : 1<<12 = 4096.

Es wird also 0,5 addiert und dann die Nachkommastellen abgeschnitten:

a = (b * 15081) >> 13; // Division explizit ausgeführt als Schiebeoperation

gerundet:

a = (b * 15081 + 4096) >> 13;

Weblink zum Runden