mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik integer_festkommazahl


Autor: bachour (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> norlasieren

= normalisieren !?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das sagt der Richtige...

Autor: bachour (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Wegstaben ,
ja und danke für den Hinweis

Autor: bachour (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: j0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: bachour (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

>
>
>

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bachour (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Bachour (Gast)
Datum:

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

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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)

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.