Division durch 10

OP #2347572
Hallo,
ich habe schon das Forum durchstöbert aber keine Lösung gefunden.
Ich möchte eine 4-stellige Dezimalzahl in die einzelnen Ziffern 
zerlegen. Habe mal irgendwo eine "Bitmanipulation" als Ersatz für die 
Division durch 10 gesehen, leider finde ich es nicht wieder.
Wer hat eine Lösung?
Atmega 16 mit AVR Studio in C.

Gruß Marc

Besten Dank im voraus.
Gast #2347649
Ich denke mal du erinnerst dich da an die Division bzw Multiplikaion 
durch bitweises verschieben. Das funktioniert aber nur für Potenzen von 
zwei
Also z.B.
12 * 2  = 12 << 1
12 * 4  = 12 << 2
12 * 8  = 12 << 3
12 * 16 = 12 << 4
usw.

Division ist dann eben genau andersrum. Wie auch immer - für die 10 
funktioniert das so ohne weiters nicht.
OP #2347756
Besten Dank für die vielen Antworten.
Die einfache Version mit / und % funktioniert leider nicht. Irgendwie 
scheint es bei der Division zu Ungenauigkeiten zu kommen.
Im Moment scheint mir der Tipp von Peter der vielversprechendste zu 
sein.

Vielen Dank für eure Hilfe
Gruß Marc
#2347757
Marc Höner schrieb:
> Besten Dank für die vielen Antworten.
> Die einfache Version mit / und % funktioniert leider nicht. Irgendwie
> scheint es bei der Division zu Ungenauigkeiten zu kommen.

Ungenauigkeiten?
Bei einer Integer Division?

Du beliebst zu scherzen. Zeig mal.

(Ich lehn mich mal aus dem Fenster und behaupte du hast Flieskomma im 
Spiel und keine Rundungskorrektur gemacht)
OP #2347861
Hier der Code:

        switch (xpdr_cursor) {
        case 1:
          value = xpdr_code/1000;
          break;
        case 2:
          value = xpdr_code/100;
          value = value%10;
          break;
        case 3:
          value = xpdr_code/10;
          value = value%10;
          break;
        case 4:
          value = xpdr_code%10;
          break;
        default:
          break;

xpdr_code ist max 4-stellig, soll in seine digits zerlegt werden und ist 
int16, value ist int8

Fehler habe ich bei case 3 (3. Stelle), hier werden teilweise, aber 
nicht immer falsche Werte ausgegeben. Das mit der Division war so eine 
Vermutung, hatte ich mal gehört. Bin nicht so der Experte.
Fliesskomma ist allerdings nicht im Spiel.

Gruß Marc
Persönliche Seite #2347877
Wenn die Division im Compiler – zumal die durch 10 – fehlerhaft wäre, 
dann wär das schon längst aufgefallen. Der Fehler stekt vermutlich 
woanders, in der Ausgaberoutine, Glitch, Stacküberlauf, Puffer zu 
klein...

Dein Beispiel lässt sich lzudem nicht übersetzen und nachvollziehen, da 
es kein gültiger C-Code ist: Keine Deklarationen, etc.
OP #2347894
Das Problem ist gelöst.

Marc Höner schrieb:
> case 3:
>           value = xpdr_code/10;
>           value = value%10;

Der Fehler lag in der Variablendeklaration. Ich habe jetzt value als 
int16 deklariert und alles klappt. Ist ja auch logisch. Wenn ich eine 
4-stellige Zahl durch 10 teile können Werte größer 255 herauskommen. Man 
muss nur mal drauf gestossen werden.
Besten Dank an alle die Tipps gegeben haben.
Gruß Marc

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.