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