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
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
1 | Ergebnis = X / Y / Z; |
2 | if( Ergebnis * Z * Y == X ){ |
3 | // gültig
|
4 | }
|
Peter
@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?
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.
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.