Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Fließkomma Rechnung Kategorie: Programmierung (von Lutz Kubens - 5.04.2005 15:18)
Als Antwort auf Re: Fließkomma Rechnung von krassos - 5.04.2005 4:09
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.0
> > Hallo,
> >
> > für die Berechnung eines Winkels aus 2 Koordinaten wollte ich die function atang_korr aus
> > dem Modul mathx benutzen. Da es nicht funktionierte, bemerkte ich, daÃ? die FlieÃ?komma
> > Berechnung nicht funktioniert. Die C Control Unit rechnet nur mit gerundeten ganzen
> > Zahlen. Um das zu verifizieren habe ich eine einfache Tangens Rechnung programmiert
> > ( a/b=tan). Aber es kommen immer nur ganze Zahlen heraus, obwohl die Variablen
> > durchweg als float deklariert sind. Anstatt z.B. 0,123456 lä�t sich mit dem LCD oder auch
> > per hwcom zum Terminalprogramm nur eine 0 abbilden.
> > Wie kann ich die Unit bewegen, mit Kommastellen zu arbeiten ?
> >
> > Lutz Kubens
>
> Hallo,
> ein Auszug aus Deinem Programm wäre hilfreich, denn der Compiler der IDE
> hält hier einige Fallstricke bereit.
>

Hallo krassos,
hier in groben Zügen, wie das Programm aufgebaut ist:
float WPnord[30], WPeast[30];
thread main
{int n, anz; hwcom.init();hwcom.setspeed(5);
for n = 0 ... 29 { WPnord[n]=0;WPeast[n]=0;} // Initialisieren der Variablen
Einlesen von Wegpunkten in die Arrayvariablen (z.B. WPnord[0]=180808,WPeast[0]=31603,
bereits umgerechnet in Bogensekunden über PC via hwcom)
run rechnen;
halt;
} // Ende thread main
thread rechnen
{int n, anz; float diffwegn[30], diffwege[30], winkel[30], errweg[30];
string s40;
for n = 0 ... 29 { diffwegn[n]=0;diffwege[n]=0;winkel[n]=0;errweg[n]=0;}
// errechnen des Weges aus der Differenz von Position zum ersten Wegpunkt für
// Vektor Nord und Vektor East und des Winkels zum Wegpunkt in Metern.
// anz ist die eingegebene Menge der Wegpunkte.
for n = 0 ... anz-1
{if (WPnord[n+1]-WPnord[n])==0 {diffwegn[n]=0;} // damit keine Division durch Null erfolgt
// Ergebnis der Division darf aber negativ sein
else {diffwegn[n]=(WPnord[n+1]-WPnord[n]*myconst.secnord;} // secnord= 30.90159
if (WPeast[n+1]-WPeast[n]==0 {diffwege[n]=0;} // dasselbe für den Ostvektor
else {diffwege[n]=(WPeast[n+1]-WPeast[n])*myconst.seceast;} // seceast=19.49769
errweg[n]=math.sqrt(math.sqr(diffwegn[n])+math.sqr(diffwege[n]));
// errechnen des Winkels
if diffwegn[n]==0 or diffwege[n]==0 {  } // verhindern einer Division durch Null
else {winkel[n]=mathx.atang_korr(diffwege[n],diffwegn[n]);}
// diffwege(Ostvektor=x)/diffwegn(Nordvektor=y) = atang, sollte der Winkel herauskommen
str.putfloat(s40,winkel[n]);hwcom.print(s40);hwcom.ret();
} // Ende for n ...
} // Ende thread rechnen

Ich hoffe, daÃ? ich nichts Wesentliches weggelassen habe. Das Ã?bertragen der Wegpunkte
vom PC und das Umrechnen in Sekunden funktioniert als Bytearray, wird in Teilstrings
umgewandelt, und in einen Zahlenwert umgerechnet. Das ist nötig, da der Wegpunkt auch
einen Namen hat und die C-Control Unit nur Strings mit 30 Zeichen verarbeitet.
Die Eingabe der Sekundenwerte der Vektoren habe ich wie folgt gelöst:
// Extrahieren der Sekunden aus dem Bytearray
strx.split(c3[3],c7,'.');
nordss1=strx.getNum(c7[0]);
nordss2=strx.getNum(c7[1]);
// nordss2 ergibt den Nachkomma Anteil, z.B. 8 nach getNum
nordss=nordss1+(nordss2/10*0.6); //  *0.6 ist Umrechnung der sec von 100 auf 60
WPnord[n] = nordgg + nordmm + nordss // nordgg=50*3600,nordmm=13*60

Da bekomme ich aber auch schon keine Nachkommastellen angezeigt, sondern gerundet.

GruÃ? Lutz


    Antwort schreiben


Antworten: