Double Berechnungen

Gast #1639472
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?
Gast #1639477
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren