www.mikrocontroller.net

Forum: GCC Anzahl der Ziffern in Zahl feststellen, vorgehensweise mit Logarithmus?


Autor: Ludolf (Gast)
Datum:

Hallo,

angenommen ich habe eine integer Zahl 9264

Der Logaritmus mit der Basis 10 eignet sich prinzipiell ja hervorragend
dafür?

Mir ist nur die genaue Vorgehensweise ein Rätsel, soll man die Zahl 9264
durch alle Möglichkeiten, also 1,10,100,1000 und so weiter, nach dem
Prinzip, Trial and Error teilen oder kann man das auch effizienter
machen?

Viele Grüße Ludolf, aber nicht vom Schrottplatz :-)
Autor: Tajas R. (tony)
Datum:

Die Zahl solange durch 10 teilen, wie der Quotient größer 0 ist. Die
Anzahl der Ziffern ist die Anzahl der Divisionen inklusive der letzten.
Bei negativen Werten natürlich andersherum oder den abs nehmen...
Autor: Roger Rithmus (Gast)
Datum:

Ludolf schrieb:
> Mir ist nur die genaue Vorgehensweise ein Rätsel, soll man die Zahl 9264
> durch alle Möglichkeiten, also 1,10,100,1000 und so weiter, nach dem
> Prinzip, Trial and Error teilen oder kann man das auch effizienter
> machen?

Möchtest Du nur die Anzahl der Stellen herausfinden?
Dann ist die folgende Methode recht effizient:
(Beispiel für einen 16-Bit Wert, 0..65 535 )
Von der Ursprungszahl 10 000 abziehen: Kein Überlauf? -> 5 Stellen
Ansonsten:
Von der Ursprungszahl 1 000 abziehen: Kein Überlauf? -> 4 Stellen
Ansonsten:
Von der Ursprungszahl 100 abziehen: Kein Überlauf? -> 3 Stellen
Ansonsten:
Von der Ursprungszahl 10 abziehen: Kein Überlauf? -> 2 Stellen
Ansonsten:
Von der Ursprungszahl 1 abziehen: Kein Überlauf? -> 1 Stellen
Ansonsten: 0 Stellen
Autor: Daniel Polz (dpolz)
Datum:

Der effizienteste "Algorithmus" wäre wohl, einfach einen Vergleich mit
den Zehnerpotenzen anzustellen. Division in Software kostet bei großen
Zahlen deutlich mehr Zeit, da ja in mehrere Subtraktionen, Vergleiche
und Sprünge aufgeteilt wird. Logarithmus ist auch eklig.

cpi r16, 10
brlo einstellig
cpi r16, 100
brlo zweistellig
rjmp dreistellig
Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Ludolf schrieb:
> Hallo,
>
> angenommen ich habe eine integer Zahl 9264
>
> Der Logaritmus mit der Basis 10 eignet sich prinzipiell ja hervorragend
> dafür?

Ja, mit dem Logarithmus lässt sich die Anzahl der Ziffern "geschlossen"
ausdrücken für eine natürliche Zahl:

1) Berechne den Logarithmus der Zahl. Und zwar zu der Basis b,
   bezüglich der die Anzahl die Ziffern zu bestimmen ist.

2) Runde die Zahl nach unten ab auf die nächste ganze Zahl.
   Ist die Zahl bereits ganz, so wird sie nicht verändert.

3) Zähle 1 drauf.

Voilà
\text{ziffern}(n) = 1+\lfloor\log_b(n)\rfloor

Ob es praktikabel ist, log einzusetzten, hängt vom den
Einsatzbedingungen ab. Für die Zahl oben und für Menschen ist es z.B.
einfacher, bis 4 zu zählen ;-)
Autor: Peter (Gast)
Datum:

Wie im anderen Thread schon geschrieben, ich bin ein Freund von den in C
vorhandenen Boardmitteln.
Einfach mit mit itoa oder ltoa in einen String wandeln und mit strlen
die Anzahl der Stellen bekommen.
Auch hier wieder, es muss genügend Zeit, RAM und FLASH vorhanden sein,
was selbst bei minimal CPUs eigentlich im Überfluss vorhanden ist
Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Peter schrieb:

> was selbst bei minimal CPUs eigentlich im Überfluss vorhanden ist

Jo klar. Ist schon ein Widerspruch in sich.
Autor: Peter Dannegger (peda)
Datum:

Am schnellsten gehen Vergleiche:
uint8_t digits( uint16_t val )
{
  uint8_t i = 1;
  switch( val ){
    default:            i++:
    case 1000 ... 9999: i++;
    case 100 ... 999:   i++;
    case 10 ... 99:     i++;
    case 0 ... 9:       return i;
  }
}

Peter
Autor: newbie (Gast)
Datum:

@PEDA

Bei Deiner Lösung mit switch case ohne break musste ich zweimal
hinschauen, bis ich die Funktion verstanden haben.

Über den Einstiegspunkt in die nach Größe geordneten cases und das
fehlende break pro case wird das i++ entsprechend oft ausgeführt.

Dieses Konstrukt hat was, ist aber wahrscheinlich für einen Newbie wie
mich etwas zu anspruchsvoll.
Autor: A. K. (prx)
Datum:

Insbesondere aber gehört "case 1 ... 10:" nicht zum C Standard, ist eine
Spracherweiterung in GCC.

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




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net