Go Down

Topic: Problem mit Float und Double und Serial (Read 790 times) previous topic - next topic

lord-maricek

Jun 02, 2010, 08:48 pm Last Edit: Jun 02, 2010, 08:50 pm by lord-maricek Reason: 1
Hi,
ich bin gerade dabei, aus 2 Koordinaten den Kurs und die Entfernung zu berechnen. Dafür habe ich angefangen ein Programm zu schreiben.
Die Breiten und Längenunterschiede kann ich schon mit einem Programm berechnen. Aber jetzt habe ich ein Problem.
Ich speichere die Koordinaten und Längen-, Breitenunterschiede in integer Arrays.
Code: [Select]

//Start 52°20'50,54"N 10°11'55,11"E
int s_breite[] = {5,2,2,0,5,0,5,4};
int s_lange[]  = {0,1,0,1,1,5,5,1,1};
//Ziel 52°20'52,93"N 10°12'02,95"E
int z_breite[] = {5,2,2,0,5,2,9,3};
int z_lange[]  = {0,1,0,1,2,0,2,9,5};

Jede Zahl hat einen eigenen Platz.
Jetzt versuche ich aus dem Breitenunterchied die NM auszurechnen.
Code: [Select]

float b_dif_nm = ((b_dif[6] * 10) + b_dif[7]) / 100;

Leider geht das nicht. Ich habe festgestellt, das bei doubble und Float immer nur die ersten beiden Nachkommastellen, über die Serielle Schnittstelle übergeben werden. Wenn ich das aber berechnen lasse, bekomm ich immer nur 0.00. Wenn ich das geteilt durch 100 weglasse bekomme ich 39.00.
Die Koordinaten sind so aufgebaut.
Code: [Select]

Arraypositionen:     01   23  45 67
nunterschied:          00 ° 00' 02,39"

Da ich die NM ausrechnen will. Muss ich erst 3*10 + 9 rechnen, um erst mal die 39 zu bekommen. Danach muss ich durch 100 teilen, dann + die 02 und wieder durch 100. Als letztes muss ich das ganze noch mal (100/60) nehmen. Aber irgendwie geht was nicht.

Könnt ihr mir helfen?

Philipp

knuff

#1
Jun 06, 2010, 08:39 pm Last Edit: Jun 06, 2010, 08:49 pm by knuff Reason: 1
Bei 39/100 bekommst du 0 raus weil du nur mit ganzen Zahlen rechnest..
(integertyp / integertyp = integerergbnis)

Was du vermutlich haben willst ist ein Fliesskommaergebnis:
(fliesskommatyp / irgendwas = fliesskommaergebnis)
und
(irgendwas / fliesskommatyp = fliesskommaergenbis)

Entweder solltest du also "((b_dif[6] * 10) + b_dif[7])" explizit nach float/double casten, oder einfach durch 100.0 statt 100 teilen, dann sollte sinnvolleres rauskommen ;)

Code: [Select]
float b_dif_nm = ((float)((b_dif[6] * 10) + b_dif[7])) / 100;

Go Up