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
@ 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
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
@ 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 > > >
> 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.
@ 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
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)
danke für die Erklärungen. ich setze mich jetzt wieder auf die Aufgabe und melde mich wieder.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.