AVR int Division

OP #4165397
Lesenswert?
• ▲
▼
Hallo zusammen,

ich habe hier ein kleines Verständnisproblem bei der Division zweier 
vorzeichenbehafteter Integer Konstanten und der anschließenden 
Multiplikation mit dem Faktor 2^12. Ich erhalte nur dann das korrekte 
Ergebnis, wenn ich entweder a, oder b, oder beide Konstanten vor der 
Division als float caste. Ich versteh einfach nicht, warum das so ist. 
Wäre super, wenn mir hier wer auf die Sprünge helfen könnte.
Als Controller kommt ein Atmega32A zum einsatz.
1
int a = 19186;
2
int b = 17174;
3
int c = 0;
4

5
c = (int)(((float)a/b - 1)*4096);  //geht
6
c = (int)((a/b - 1)*4096);  //geht nicht
Gast #4165586
Lesenswert?
• ▲
▼
Das Ganze ist im Übrigen kein AVR-Problem, sondern eine ganz normale 
Eigenschaft der Ganzzahlarithmetik.

Da ist 1000 / 600 immer 1.

Üblicherweise behilft man sich, vor allem bei "längeren" Berechnungen 
damit die Werte - vorübergehend - zu erhöhen. Wichtig ist hierbei, dass 
man den möglichen Bereich nicht überschreitet.
1000  600 ist in der Zwischenrechnung mit 10000  600 = 16

Ein weiterer Trick ist die Berechnung so umzustellen, dass die 
Divisionen an anderer Stelle stattfinden.
Dann wird: (1000 / 600) * 100 über (1) * 100 = 100
zu (1000 * 100) / 600 ==> 100000 / 600 = 166
Gast #4165591
Lesenswert?
• ▲
▼
Bernd K. schrieb:
> Jetzt Nicht schrieb:
>> Man sollte hier auf Float verzichten und bei integer bleiben. Einfach so
>> umformen, dann man nur minimal verliert.
>>
>> c : = (a/b - 1 ) * 4096
>> c : = ((4096 * a) div b) - 4096
>> c : = (a shl 12) div b - (1 shl 12)
>
> Aber nicht vergessen vorher auf int32 zu casten denn beim AVR ist int
> nur 16 bit und 16 bit reichen nicht bei so großen Zahlen.

Jetzt Nicht

Antwort schreiben

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.

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.