Forum: Mikrocontroller und Digitale Elektronik integer_festkommazahl


von bachour (Gast)


Lesenswert?

hallo leute,

ich weiß nicht genau was bedeutet und brauche deswegen noch klare 
Erklärungen wie das gemacht werden soll.
in ein Program wurde empfohlen die werte zu norlasieren. alle variable 
sind integer und und wir wollen ineteger Wert mit Festkommazahlen haben. 
was bedeutet dies genau und wie soll man dies machen?

danke

von Falk B. (falk)


Lesenswert?


von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> norlasieren

= normalisieren !?

von Klaus W. (mfgkw)


Lesenswert?

das sagt der Richtige...

von bachour (Gast)


Lesenswert?

@ Wegstaben ,
ja und danke für den Hinweis

von bachour (Gast)


Lesenswert?

@ Falk
> Festkommaarithmetik
erstmal danke für den Link, ich habe gerage durchgelesen und wollte noch 
ein paar Frage stellen:
bei meinem Program   wandele ich die werte und speichere dies int 
Integer variablen, die zum Berechnung der Regler dienen und das ergebnis 
des Regler wird in einem DAC gesendet. alle mein variable sind von typ 
int.  mit sprintf kann ich daten duchr UART senden und am Hyper terminal 
anzeigen lassen.

jetzt  für eine Normierung in  festkommazahl was soll ich genau machen? 
verstehe ich vielleicht  falsch. soll ich vor jedem senden eine 
Umrechnung machen ? wenn ja wie  oder code schreiben...  oder  wie.
eine andere Frage, hab auch ghört, dass die Normierung durch schibn von 
Hexa wert besser ist was sagen sie dazu?   ´
Hilfe bitte ich bin Anfänger mit µc
danke

von j0 (Gast)


Lesenswert?

Sag mal was du genau willst.
Umwandlung einer Festkomma-INT-Darstellung in IEEE-Normalisierte 
Darstellung?
Dazu müsstest du selbst erstmal wissen, wo das Komma bei deiner INT-Zahl 
ist.

Dann machst du eine Wandlung nach Zweierkomplement, Falls deine INT-Zahl 
negativ ist.
Entsprechend wird das Vorzeichenbit gesetzt.
Dann Schiebst du die INT-Zahl so lange nach "vorne"(ROL bzw. <<), bis 
das Erste Bit =1 ist. Die Anzahl deiner Schiebeschritte musst du Zählen, 
das ist der exponent.
Die Mantisse gewinnst du nun dadurch, dass du die INT-Zahl nach alledem 
noch ein einziges Mal Weiterschiebst, sodass die führende 1 vorne 
"herunterfällt".
Die Führende 1 wird ja im IEEE-Format nicht mitgespeichert.

Viel erfolg, j0

von bachour (Gast)


Lesenswert?

@ j0 schrieb
 > Sag mal was du genau willst.
>
> Umwandlung einer Festkomma-INT-Darstellung in IEEE-Normalisierte
>
> Darstellung?
wie gesagt ich habe alle meine datentyp int und damit habe ich das 
program geschreiben. mein ADC ist 12 bit ,. wenn man zb am ausgang die 
obergrenze  erreicht dann wird am aus und am Terminal 4095 angezeigt. 
ich denkedie Normierung bedeutet an der stelle die 2,5V lesen,die  die 
referenzspannung entspricht.
>
> Dazu müsstest du selbst erstmal wissen, wo das Komma bei deiner INT-Zahl
>
> ist.
integer ist ganz normal zahl und wenn jetzt von festkomma gesprochen 
wird , weiß ich nicht genau was man damit mein deswegen frage ich

>
>
>

von Karl H. (kbuchegg)


Lesenswert?

> ich weiß nicht genau was bedeutet und brauche deswegen noch klare
> Erklärungen wie das gemacht werden soll.
> in ein Program wurde empfohlen die werte zu norlasieren.

Gib doch mal einen Link darauf.
Wer weiß was da wirklich empfohlen wurde.

Das einzige was ich mir in diesem Zusammenhang vorstellen kann, was 
'normalisieren' bedeuten könnte ist das hier:

Wenn deine FixedPoint Zahlen von zb 0 bis 4096 laufen und 4096 einer 1.0 
entspricht, dann muss man logischerweise bei einer Rechnerei die man in 
Gleitkomme so machen würde

    double a = 0.5;
    double b = 0.8;

    double Result = a * b;

in FixedPoint Arithmetik so vorgehen

    int   a = ( 0.5 * 4096 );   // bin jetzt zu faul das selber zu 
rechnen
    int   b = ( 0.8 * 4096 );   // lass den Compiler rechnen

    int Result = (long)a * (long)b / 4096;

also logischerweise das Ergebnis der Multiplikation durch 4096 
dividieren, damit das Ergebnis wieder in der erlaubten Bereich 
zurückkommt; es wird 'normalisiert'.

Das hört sich jetzt trivial an und sollte selbstverständlich sein, 
allerdings in Fällen wie diesem hier

    int Result = (long)a * (long)b * (long)c / ( 4096 * 4096);

(oder noch mehr Multiplikanden)
kann es sinnvoller sein, zwischendurch mal einen Normierungsschritt 
einzulegen, damit die Zwischenergebnisse nicht den erlaubten 
Rechenbereich verlassen.

    int Result = ( ( (long)a * (long)b ) / 4096 ) * (long)c / 4096;


Das ist jetzt eine Vermutung, was mit dem Begriff 'Normalisierung' in 
diesem Zusammenhang gemeint sein könnte und muss mit dem 'was in ein 
Program empfohlen wurde' nicht notwendigerweise irgendetwas zu tun 
haben.

Also: zeig deine Quelle, wo du diese Empfehlung her hast. Ansonsten ist 
das alles Rätselraten basierend auf Hörensagen. Und das ist nun mal 
keine gute Quelle um fundierte Aussagen treffen zu können.

von Bachour (Gast)


Lesenswert?

@ Karl

anhang dieses schreiben steht ein routine,wo ich dei Normierung machen 
soll.
die Routine wird mit 2 parameter (ist- und sollwert)von ADC aufgerufen. 
diese parameter habe  auch int definiert. ich habe erst mit Float 
angefangen und für die optimierung der zeit arbeitet ich jetzt mit 
integer.   die Eingangsspannung vor ADC ist im Bereich 0.......2,5 und 
der ADC hat 12 Bit dh, max ADC wert= 4096.
meine Frage: wäre es ok so mit int zu rechnen ohne gedanken zu machen? 
und wenn man von festkomma spricht, denke ich an de fest anzahl und 
position der Dezimalpunkt.
ich habe keine scanner hier unten ist die routine


#include<>


 int e0;    //  alte Abweichung

int PID_Berechnung(int ist, int soll)
{
  int e;
  int yp,yi,yd,y;
  int esum=0;

  e=w-x;             // Regelabweichung

    if((y>0)&& (y<4096))     //   einfrieren Stellglied
  {
    esum=esum + e;      //  Summe von e

  }

  yp= kp * e ;           //   P-Anteil
  yi=ki* Ta *esum;        //   I-Anteil
  yd= kd*(e-e0)/Ta;       //   D-Anteil
  y= yp + yi + yd;      // Stellglied


  e0=e;       //  e0 merken für nächste Abtatstung

  if(y<0)
    y=0;

  if(y>4095)
    y=4095;


  return y;
}

wenn sie eine Idee habe einfach vorschlagen, es gibt keine dumme Frage 
und nur so kann man lernen.  danke im voraus für ihre Antwort

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

FESTKOMMA (eigentlich: FEST"PUNKT", gemeint ist mit diesem Begriff immer 
der "Dezimalseperator", der den ganzzahligen Anteil einer Zahl vom 
nicht-ganzzahligen Anteil einer ZAhl trennt)


> integer ist ganz normal zahl und wenn jetzt von festkomma gesprochen
> wird , weiß ich nicht genau was man damit mein deswegen frage ich

Festkomma ist "rechnen mit Gleitkommazahlen ohne Gleitkomma-Arithmetik"

Zur Erläuterung:

"Integer-Arithmetik" (=Rechnen mit ganzen Zahlen) in einem Prozessor ist 
relativ unaufwendig. Es gibt kaum einen Prozessor, der nicht elementare 
integer-Arithmetik Rechenbefehle kennt.

Bei "Gleitpunkt-Arithmetik" (=Rechnen mit Bruchzahlen) ist es schon 
wesentlich aufwendiger. Manche Prozessoren könen sowas direkt selbst, 
bei anderen muß man entsprechende Arithmetik-Rutinen nutzen, um 
Bruchzahlen-Rechnung zu ermöglichen.


Es gibt nun bestimmte Situationen, in denen man "sehr genau" rechnen muß 
bis zum Beispiel zur 10. Nachkommastelle. Die Kreiszahl PI ist z.B. 
solch eine "unendliche Bruchzahl" [3.1415926.....], und für manche 
Situationen muß man da halt "sehr genau" alles nutzen, was an 
Nachkommastellen möglich ist.

Manchmal ist es aber gar nicht notwendig, so genau zu rechnen. Nimm zum 
Beispiel Währungen: Einen Betrag von 1 EUR und 23 Cent zu addieren mit 2 
Euro 14 Cent kann über Gleitpunktarithmetik gerechnet werden:

1. Setze Gleitpunktzahl a = 1.23
2. Setze Gleitpunktzahl b = 2.14
3. errechne Gleitpunktzahl c = a + b = 3.37

Das ist aber gar nicht notwendig, man könnte jetzt gleich alles "mal 
100" rechnen, also den Dezimalpunkt erst mal weglassen, und alles in 
Ganzzahlarithmetik rechnen. Zum Schluß wird der Dezimalpunkt wieder 
passend hinzugefügt, und alles stimmt wieder:


1': Wandle Gleitpunktzahl a 1.23 in Dezimalzahl aa = 123  um [mit der 
ergänzenden Rechenvorschrift: Multipliziere mit 100, mache dann eine 
Datentypenwandlung]

2': Wandle Gleitpunktzahl b 2.14 in Dezimalzahl bb = 214  um [mit der 
ergänzenden Rechenvorschrift: Multipliziere mit 100, mache dann eine 
Datentypenwandlung]

3' Addiere:
Dezimalzahl aa = 123 +
Dezimalzahl bb = 214 ergibt
Dezimalzahl cc = 337

4' Wandle Dezimalzahl cc in eine dargestellte "Gleitpunktzahl" um [mit 
der Darstellungsvorschrift: setze zwischen den letzten beiden Ziffern 
von rechts einen Dezimalpunkt]


Somit konnte diese und alle weiteren Rechnungen mit Ganzzahlarithmetik 
durchgeführt werden (mit einem Festpunkt, also mit einem "gedachten" 
Dezimalpunkt an einer festen Stelle)

von Bachour (Gast)


Lesenswert?

danke für die Erklärungen. ich setze mich jetzt wieder auf die Aufgabe 
und melde mich wieder.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> 4' Wandle Dezimalzahl cc in eine dargestellte "Gleitpunktzahl" um [mit

muß natürlich heißen

4' Wandle Dezimalzahl cc in eine dargestellte "Festpunktzahl" um [mit

.. da ja ein Fester Punkt verwendet wird, und kein "gleitender" Punkt 
(=Bruchzahlenarithmetik)

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
Noch kein Account? Hier anmelden.