Forum: Compiler & IDEs Double Berechnungen


von Marcel G. (Gast)


Lesenswert?

Hi,

Ich schreibe derzeit im Zuge einer studienarbeit einen datenlogger auf 
basis eines AT324P. Die Funktionalitaet ist nahezu fertig jedoch haenge 
ich jetzt vor einem problem, was mir persoenlich trivial erscheint, aber 
einfach nicht funktionieren will.
Das Problem ist folgendes:
Um in regelmaessigen Intervallen die Eingaenge abzuspeichern habe ich 
eine Uhr die mit dem DCF77 Signal syncronisiert ist. Beim starten der 
Aufnahme speichere ich mir also die aktuelle zeit ab, und beim schreiben 
jedes datensatzes auch. Ist die differenz meiner aktuellen uhrzeit 
gegenueber des letzten datensatzes >= des intervalls, wird ein neuer 
datensatz geschrieben. Das ganze ist so ausgelegt, dass die Intervalle 
in 10ms schritten angepasst werden koennen.

Ich habe folgenden Codeabschnitt zum testen geschrieben (ergibt wenig 
sinn ;)
1
double micro = getMicroTime();
2
double unix = (double)getUnixTime();
3
double diff = micro - unix;
4
5
char buf[16];
6
dtostrf((subcount/100.0), 13, 2, buf);
7
lcd_set_cursor(1,0);
8
lcd_string(buf);
9
10
dtostrf(micro, 13, 2, buf);
11
lcd_set_cursor(2,0);
12
lcd_string(buf);
13
14
dtostrf(unix, 13, 2, buf);
15
lcd_set_cursor(3,0);
16
lcd_string(buf);
17
18
dtostrf(diff, 13, 2, buf);
19
lcd_set_cursor(4,0);
20
lcd_string(buf);

getMicroTime() - double - representiert die Unix Timestamp bis auf 1ms 
genau (z.B. 1268008800.120)
getUnixTime() - long - gibt die Unix Timestamp zurueck
diff - sollte nun logischerweise die anzahl der millisekunden sein.

subcount ist eine globale variable und enthaelt die millisekunden.

Das merkwuerdige ist ... subcount/100.0 zaehlt schoen zwischen 0 und 1
Die Unix Timestamp hat einen wert, der sich nicht veraendert (wenn ich 
sie mit ltoa ausgebe funktioniert alles)
Die MicroTime hat den selben wert wie die unix time, obwohl sie 
berechnet wird aus:
1
double getMicroTime()
2
{
3
  return ((double)getUnixTime()) + (subcount/100.0);
4
}

so wie ich das anschaue funktioniert also die addition der beiden double 
werte nicht, bzw. der cast von long zu double um dann damit zu rechnen.

Hat jemand ne Idee was falsch ist?

von Marcel G. (Gast)


Lesenswert?

Ok ... ich hab grade gelesen, dass double nur 6 relevante stellen hat 
weil 32bit.

Hat jemand trotzdem eine Idee, wie ich das problem loesen kann? long ist 
einfach zu klein fuer die unix timestamp incl. den millisekunden

von GG (Gast)


Lesenswert?

uint32_t oder uint64_t

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.