mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega32: Probleme beim Potenzieren


Autor: Merviux (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin da auf eine Seltsamkeit in meinem Programmablauf gestossen. Ich
versuche mich gerade in gcc mit WinAvr auf einem Atmega32. Ich lese  aus
einem Feld Zahlen aus, bis ein 'f' gefunden wird. Der Grund: ich
erhalte über RS232 eine Befehlsequenz, z.B. 'f123*'. Bei dem '*'
lese ich die vorher im Feld abgelegten Zeichen, bis eben zum 'f'.
Um daraus eine Zahl zu generieren, multipliziere ich die erste (hier
also '3') mit 10^0, die 2. mit 10^1, die 3. mit 10^2 usw. Bei jedem
Schleifendurchgang wird das Ergebnis dem Wert aus dem vorherigen
Durchgang addiert. So erhält man 3 + 20 + 100 = 123. Das mache ich mit
der Funktion "double pow(double x, double y) aus der avr/math.h.
Theoretisch!
Nun folgendes: Bei einer Ziffer (10^0) funktioniert es problemlos. Bei
2 Ziffern "klaut" der Mikrocontroller mir etwas. Wenn ich z.B. eine
'12' auslese, erhalte ich nach der Rechnung eine '11', bei einer
111 nur eine '109', bei 1000 sogar nur '997'. Also wird pro
Schleifendurchgang immer eine 1 abgezogen, wie der Fiskus im echten
Leben!
Natürlich kann man dieses Problem durch "Schummeln" lösen, aber warum
passiert das?
Kann mir jemand sagen, woran das liegt oder ob ich eine wichtige
"Selbstverstädnlichkeit" nicht beachtet habe?
Danke für Eure Zeit!

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also für den umständlichsten und langsamsten Code würdest Du ein
Anwärter auf den ersten Preis sein.

Es ist immer sehr unglücklich, Ganzzahlen zwischendurch in float und
wieder zurück zu verwandeln.

Schau Dir mal die Funktion atoi() an, die kanns viel besser.


Peter

Autor: Merviux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

vielen Dank für den atoi()-Hinweis. Das klappt sehr gut! Ich habe die
Geschichte umgeschrieben und verzichte auf meine
"Preisverdächtige"-Routine.
Trotzdem beschäftigt mich immer noch die Frage: Warum fehlte immer eine
1?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die von Peter erwähnte Umwandlung von float zu int. C definiert da
striktes "abrunden", womit aus 9.9999 nicht 10 wird sondern 9.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Korrektur: "abschneiden", nicht "abrunden".

Autor: Merviux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A.K.
Danke! Wenn man mit der Nase hineingestoßen wird, ist es ja nur zu
offensichtlich. Das sind aber diese "wichtigen
Selbstverständlichkeiten", Kenntnisse, die ich immer wieder vergesse
zu beachten bzw. noch einmal zu überdenken.

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.