www.mikrocontroller.net

Forum: Compiler & IDEs Double Berechnungen


Autor: Marcel G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)
double micro = getMicroTime();
double unix = (double)getUnixTime();
double diff = micro - unix;

char buf[16];
dtostrf((subcount/100.0), 13, 2, buf);
lcd_set_cursor(1,0);
lcd_string(buf);

dtostrf(micro, 13, 2, buf);
lcd_set_cursor(2,0);
lcd_string(buf);

dtostrf(unix, 13, 2, buf);
lcd_set_cursor(3,0);
lcd_string(buf);

dtostrf(diff, 13, 2, buf);
lcd_set_cursor(4,0);
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:
double getMicroTime()
{
  return ((double)getUnixTime()) + (subcount/100.0);
}

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?

Autor: Marcel G. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: GG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uint32_t oder uint64_t

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.