mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit großen Zahlen


Autor: Phil J. (sunflower_seed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit avr-gcc und dem Umgang mit großen Zahlen.

Ich muss einen Wert den ich in Sekunden besitze in Stunden umwandeln und 
auf einem Display ausgeben.
Soweit, so gut.

Die Sekunden liegen mir in bis zu vier Hex-Werten vor.
Der maximale Wert ist jeweils 0xFF

Die Werte lassen sich auch einfach zusammentüddeln:

wert1*0x01 + wert2*0x100 + wert3*0x10000

nur spätestens da wird die geschichte ziemlich groß.
Dann muss das ganze noch durch 3600 (0xE10) geteilt werden, damit ich 
meine Stunden hab.

Und wenn ich versuche das ganze auf nem Display mit sprintf auszugeben, 
darf meine variable nicht größer als uint16 sein.

Also wie stelle ich das am besten an?

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sprintf() sollte eigentlich tabu sein, ausser allenfalls fuer 
debugzwecke.

Ich wuerd mit longint oder longword arbeiten. Also signed oder unsigned 
32 bit.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Phil J. schrieb:
> Und wenn ich versuche das ganze auf nem Display mit sprintf auszugeben,
> darf meine variable nicht größer als uint16 sein.
Das wären doch immerhin 65535 Stunden...

> Also wie stelle ich das am besten an?
Ich vermute mal, dass dein Ansatz irgendwie verkorkst ist.
Poste mal deinen Code und sag dort, wo es klemmt...

Autor: MitLeser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sekundenzähler als unsigend long und dann für die
Stunden durch 3600 teilen. Den Wert auf uint16 prüfen (wenn wichtig
"überlauf" auswerten) und dann in uint16 casten.
Wie Lothar bereits schrieb sind dann halt "nur" max.65535 Stunden.

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wiveiel Stellen hinter dem Komma sollen es sein? wenn es nicht 100% 
genau sein soll, dann könnte man Wert1 ignorieren, nur noch wert2*0x01 + 
wert3*0x0100... machen und auch nur durch (3600/256) teilen statt durch 
3600. Dann hätte man beim Zwischenschritt der Gesamtsekunden schonmal 
eine Größenordnung weniger...

Autor: Phil J. (sunflower_seed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt mit itoa versucht.
Das geht auch schon mit mehr Stunden.
Aber ich habe bei itoa immer eine kleine Abweichung.
Das ist mir auch schon bei einem anderen Projekt aufgefallen.
Woher kommt das denn?

Autor: Phil J. (sunflower_seed)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das letzte nehme ich zurück.
Muss ja ltoa sein beschämtguck

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.