ganzzahliger Rest vom Ergebnis = 0? - wie erkennen?

Gast #259865
Hallo,

für ein 8052-Projekt, programmiert in C, muss der Controller folgende
(verallgemeinte) Formel berechnen:

Ergebnis = X  Y  Z;

X, Y, Z sind ganzzahlige, unsignierte Char-Variablen.
Das Ergebnis ist nur dann gültig, wenn der Rest dieser Division = 0
ist.

Wie kann ich das erkennen? Muss ich dazu parallel eine Division mit
Modulo machen?
Also Ergebnis =  X % Y % Z;

Danke

Ralf
Gast
Hallo Ralf,

wenn X % Y = 0 gilt, ist auch X % Y % Z = 0,
dann muß aber noch lange nicht X / Y % Z = 0 gelten.

Also funktioniert Deine Überlegung so nicht.

Aber versuche mal folgenden Ansatz:
X  Y  Z ist das gleiche wie X / (Y * Z).

Somit könntest Du zunächst
A = Y * Z   berechnen und anschließend
Ergebnis = X / A   sowie
Rest = X % A   bestimmen.

Gruß,
Markus_8051
@Peter
Dein Code ist ohne Frage korrekt, vermutlich wird der Compiler die
Rechnung aber nicht groß optimieren können.
Wie das bei "8052 C --> Maschinensprache" ist, weiss ich nicht, aber
üblicherweise fällt bei der Integer-Division der Rest quasi als
Abfallprodukt ab. Eventuell kann der Compiler bei der Benutzung von
"a/b" und "a%b" besser optimieren?
Gast
In C gibt's normalerweise noch die Funktion ldiv, die dir Ergebnis und
Rest der Division gemeinsam zurückgibt. Da bei der Division der Rest ja
automatisch "anfällt", ist das wohl die schnellste Alternative.
Gast
Danke für die Vorschläge.
Ich werde sie ausprobieren.

@Markus_8051:

> wenn X % Y = 0 gilt, ist auch X % Y % Z = 0,
> dann muß aber noch lange nicht X / Y % Z = 0 gelten.

Und wenn ich folgendes mache:

if((X % Y) % Z == 0)
 Erg = X  Y  Z;

Das müsste dann doch gehen, oder?
Oder haperts noch ein bisschen bei mir?

Ralf
Gast
@Ralf:  (X % Y) % Z ist das gleiche wie X % Y % Z, und das funktioniert
- wie oben geschrieben - nicht!
X % (Y % Z) wäre etwas anderes, liefert aber auch nicht das was Du
suchst - zusätzlich wird es Div by Zero - Errors geben!!!

Du hast doch jetzt zwei Lösungen: einen Ansatz von mir und eine fertige
C-Routine von Peter. Was willst Du noch?

Gruß,
Markus_8051

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.