Forum: Mikrocontroller und Digitale Elektronik ganzzahliger Rest vom Ergebnis = 0? - wie erkennen?


von Ralf (Gast)


Lesenswert?

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

von Markus_8051 (Gast)


Lesenswert?

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

von Peter Dannegger (Gast)


Lesenswert?

1
  Ergebnis = X / Y / Z;
2
    if( Ergebnis * Z * Y == X ){
3
      // gültig
4
    }


Peter

von A. D. (ad1)


Lesenswert?

@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?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Ralf (Gast)


Lesenswert?

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

von Markus_8051 (Gast)


Lesenswert?

@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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.