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)
> 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)