PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Geschickt runden



Mauro
24.06.2010, 11:57
Hallo zusammen!
Lange konnte ich den Weg mit meinem mega324 alleine gehen und mich gut mit ihm anfreunden.
Der letzte Schritt meiner Arbeit steht kurz bevor, und ich brauche mal wieder einen Input von Euch.
Ich habe eine Längengrad-GPS-Sensorwert mit 32Bit vorliegen (int32_t).
Diesen möchte ich in Meter umrechnen, das passiert mit einer Multiplikation von 111320m. Anschließend muss ich den Wert runterskalieren, das der Längengradwert mit 10^7 skaliert ist.

In Neuseeland habe ich einen GPS-Wert von ca. 2*10^9, also knapp unter der Grenze von int32_t.

Rechne ich wie oben beschrieben
(2*10^9*111320)/10^7
habe ich ja bereits im Klammerausdruck den Bereich von int32_t verlassen.

Wenn ich vom GPS-Wert nur die ersten zwei,drei Nachkommastellen nehmen würde, wird es immernoch eng.

Lohnt es sich auf int64_t auszuweichen?
Was macht der erfahrene mueC-ler?

Liebe Grüße aus dem think-tank,
eMM

TobiKa
24.06.2010, 12:10
(2*10^9*111320) / 10^7 = 2*10^2*111320

Mauro
24.06.2010, 12:16
Das ist rein mathematisch richtig, aber so verliere ich sieben Nachkommastellen und das ist nicht schön gerundet, oder?
Das entspräche 200 Schritte um die halbe Welt, dass das zu grob ist, ist offensichtlich.

TobiKa
24.06.2010, 12:27
Achso,hab mich von der 2 iritieren lassen.
Was spräche denn gegen eine 64Bit Variable?

Mauro
24.06.2010, 12:59
Die habe ich noch nie eingesetzt, kann also nicht beurteilen, die der Wahnsinn ist :-)
Dann werde ich es wohl mal versuchen...
Try and...

PicNick
24.06.2010, 14:29
Kannst du nicht erst 111320 / 10^7 rechnen (0,011132)

und den 32-Bit wert dann damit multiplizieren ?

also z.B 2*10^9 * ( 111320 / 20^7 )

TobiKa
24.06.2010, 14:43
Bevor ich ein float benutze, nehm ich lieber ne 64Bit Varialbe...

BurningWave
24.06.2010, 14:48
Warum kein float, dann kannst du zum Runden auch floor() aus math.h benutzen.

Mauro
25.06.2010, 10:43
Kannst du nicht erst 111320 / 10^7 rechnen (0,011132)

und den 32-Bit wert dann damit multiplizieren ?

also z.B 2*10^9 * ( 111320 / 20^7 )

Würde ich nur den Bruch berechnen, hätte ich ja 0,011132, das wäre dann 0, oder?
Wenn ich in der gleichen Rechnung nun noch multipliziere, wird dieser Float-Wert dann tatsächlich weitergerechnet? Weil ich hätte gesagt, dass bei der Rechnung sonst immer mit 0 multipliziert wird, weil Float<1...

Aber vielleicht habe ich einfach keine Ahnung :-)

Das hier ist wohl eher eine Frage zum Verständnis...
Grüßle, eMM

Besserwessi
25.06.2010, 11:50
Die GPS Berechnung sollte ja nicht so zeitkritisch sein, und der mega324 hat auch recht viel Platz. Da könnte man also ruhig 64 Bit Zahlen nehmen. Mit den 32 Bit Zahlen wird halt nie eine echte 32 Bit x 32 Bit Multipikation ausgeführt. Wenn dann ohnehin für was anderes Float Zahlen hat, kann man auch mit Float rechenen, die Auflösung ist aber geringer, sogar geringer als nur 32 Bit Integers.


Bei der Umrechnunh Längengrad in Meter muß man etwas aufpassen. Wenn man das ab dem Längengrad 0 macht, kriegt man in Neusehland oder den USA ein schiefes Koordinatensystem. Die Umrechnung von der Kugen in die Ebene geht nur gut lokal - also erstmal beim Längengrad den Bezugspukt abziehen.