www.mikrocontroller.net

Forum: Compiler & IDEs avr-libc und div()


Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin grad drüber gestolpert: m.W. darf in C zwar das Ergebnis von (-3)/2
wahlweise -2 oder -1 sein, der Quotient aus div(-3,2) jedoch muss -2
sein. Ist -1. Riecht nach Fehler in der avr-libc.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liest du das denn raus?

Insbesondere sehe ich im Standard keinen Unterschied zwischen den
Divisions- und Modulo-Operatoren und der div()-Funktion.  Damit sollte
sich ein div() immer genauso benehmen wie die beiden
Einzeloperationen.

Dass es div() überhaupt gibt, liegt wohl einfach daran, dass die
Division die teuerste Grundrechenoperation ist und dass zwangsweise
bei den verwendeten Algorithmen zusammen mit der Division selbst auch
der Rest übrig bleibt (so wie in der Grundschule mit der schriftlichen
Division ja auch ;-).  Da ein Aufrufer oft beides benötigt, liegt es
nahe, die Operation nur einmal auszuführen.

Der Standard beschreibt für die Division einigermaßen umständlich,
dass die Semantik der Integer-Division ein ``round towards zero''
ist.
Damit ist eigentlich mehr als klar, dass -3 / 2 = 1 ist.

Ich bin gerade auf das rationale zum Standard gestoßen:

http://www.open-std.org/jtc1/sc22/wg14/www/C99Rati...

Das Teil ist wirklich nützlich.  Dort wird ausführlich beschrieben,
warum man für die Integer-Division vom C89-``implementation
defined''
approach zum ``round towards zero'' übergegangen ist.

Table 7.2: Results of div, ldiv, and lldiv

|number denom quot  rem
|     7     3    2    1
|    -7     3   -2   -1
|     7    -3   -2    1
|    -7    -3    2   -1

(Mal sehen, wie die Tabelle hier im Forum aussieht...)

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, Missverständnis meinerseits. div() ist korrekt.

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.