Hallo zusammen, ich habe gerade mal wieder einen Modulo-Arithmetik-Knoten im Kopf. Was auch daran liegt, daß es keine reine Modulo-Arithmetik ist. Ich habe ein zyklisches Zahlensystem, bei dem ich einen Überlauf begrenzen will und bei dem beide Randelemente unterschieden bleiben müssen. Das Zahlensystem geht von 0...24. Bei der Begrenzung soll der Überlauf in der gleichen Hälfte des Zahlenraums bleiben: O(-3) -> 9 ... O(-1) -> 11 O( 0) -> 0 O( 1) -> 1 ... O(10) -> 10 ... O(12) -> 12 ... O(24) -> 24 O(25) -> 13 ... O(36) -> 24 (nicht 12!) ... O(144) -> 24 ... Im Gegensatz zum "normalen" Modulo-Zahlenraum gibt es also ein Element, das doppelt belegt ist (0/24) und bei dem dieser Unterschied durchaus eine Rolle spielt, nämlich: O(24)-O(0) = 24, O(25)-O(-1) = 2, Hat jemand einen Tipp, wie man solche Operationen sinnvoll vornimmt? Viele Grüße W.T.
Walter T. schrieb: > Hat jemand einen Tipp, wie man solche Operationen sinnvoll vornimmt? Ja indem man die Doppelbelegung vermeidet. Es gibt ja auch keine Uhrzeit 24:00 oder gar 24:10, sondern nach 23:59:59 spring die Zeit auf 00:00.
ist O(37) = 13? Bringe noch ein paar Werte, ich denke mit modulo(12) und einem Offset kommst du weiter
Walter T. schrieb: > O(-3) -> 9 > ... > O(-1) -> 11 > O( 0) -> 0 > O( 1) -> 1 > O(12) -> 12 Das ist alles schon unendlich lange her, aber ich behaupte jetzt mal (ohne den mathematischen Beweis jetzt ad hoc führen zu können). Dein Zahlensystem ist kein "geordneter Körper" Siehe https://de.wikipedia.org/wiki/Geordneter_K%C3%B6rper Mit dem Zahlensystem kann man wohl weder sinnvoll addieren noch subtrahieren. Stellt sich die Frage: Warum glaubst du so ein 'Zahlensystem' benutzen zu müssen? Was soll damit erreicht werden, und gibt es nicht eine sinnvollere Alternative.
Operator S. schrieb: > ist O(37) = 13? Genau. In der oberen Hälfte und ansonsten Modulo 12. Also: 37%12 + (37 > 12 ? 12 : 0); Oder so. Da paßt nicht, daß bei 36, 48 .. "24" herauskommen soll. Operator S. schrieb: > Bringe noch ein paar Werte, ich denke mit modulo(12) und einem Offset > kommst du weiter Das wäre schön. War auch mein erster Gedanke, aber ich habe gerade keinen Hebel. Für mich ist Modulo immer "entweder es ist offensichtlich, ich kriege es auf ein Blatt Papier gezeichnet oder undurchdringbar". Momentan fällt es für mich in Kategorie 3. Der Andere schrieb: > [...] ich behaupte jetzt mal > [...] Dein Zahlensystem ist kein "geordneter Körper" > Damit kann ich leben. Ich bin ein sehr unordentlicher Mensch, was Mathematik angeht. > Mit dem Zahlensystem kann man wohl weder sinnvoll addieren noch > subtrahieren. Wie man es nimmt: Viele Operationen sind nicht definiert. Größer/kleiner/gleich-Operatoren sind definiert, Subtraktion ist definiert, wenn der Subtrahend kleiner als der Minuend ist, Division mit Rest ist definiert, wenn der Divisor kleiner als der Dividend ist. Addition ist definiert (so wie bei sättigender Arithmetik). > Stellt sich die Frage: > Warum glaubst du so ein 'Zahlensystem' benutzen zu müssen? Was soll > damit erreicht werden, und gibt es nicht eine sinnvollere Alternative. Vielleicht gibt es die. Aber momentan verfolge ich diese Idee weiter. Es geht um ein Schleppzeigersystem (wie eine Uhr, die 24h auf zwei Umdrehungen abbildet, wobei hier 0 Uhr und 24Uhr definierte Uhrzeiten sind, bei denen beide Extremwerte gültig sind (und ihre Differenz ist 24h, nicht 12h).
:
Bearbeitet durch User
1 | if(x > 24) { |
2 | y = (x % 12) + 12 |
3 | if(y == 12){ |
4 | y += 12 |
5 | }
|
6 | } else if (x < 0) { |
7 | y = (x % 12) |
8 | } else { |
9 | y = x |
10 | }
|
11 | return y |
Müsste glaube ich hinhauen
Ein Zahlensystem, bei dem eine Position zweifach belegt ist, bekommt von mir null Punkte.
Walter T. schrieb: > Es geht um ein Schleppzeigersystem (wie eine Uhr, die 24h auf zwei > Umdrehungen abbildet, wobei hier 0 Uhr und 24Uhr definierte Uhrzeiten > sind, Genau da kann ich dir nicht mehr folgen wegen: Walter T. schrieb: > O(-3) -> 9 > ... > O(-1) -> 11 > O( 0) -> 0 > O( 1) -> 1 denn daraus würde folgen O(-4) -> 8 O(-6) -> 6 und auch > O( 3) -> 3 > O( 6) -> 6 also wäre O(-6) = O(6) was irgendwo keinen Sinn macht wenn der Zyklus 24 sein soll
Ich habe den Wertebereich mal dargestellt. Der Andere schrieb: > also wäre O(-6) = O(6) Paßt. Wenn ich den Uhrzeiger um 6 Stunden zurückdrehe, bin ich bei 6 Uhr. Amateur schrieb: > Ein Zahlensystem, bei dem eine Position zweifach belegt ist, bekommt von > mir null Punkte. Nicht schlimm. Ich bin kein Marienkäfer. Ich brauche keine Punkte. Sage ich der Frau an der Kasse auch immer.
:
Bearbeitet durch User
So müsste es gehen:
1 | if (x > 24) |
2 | {
|
3 | x = 13 + ((x - 1) % 12); |
4 | }
|
5 | else if (x < 0) |
6 | {
|
7 | x = 11 + ((x + 1) % 12); |
8 | }
|
Fabian O. schrieb: > So müsste es gehen: Neee, paßt leider nicht. Aber ich glaube, ich hab's:
1 | int x; |
2 | |
3 | unsigned int temp = (unsigned int) x; |
4 | |
5 | if (x>INT_MAX) { |
6 | // Negativer Wert
|
7 | temp = (temp-1)%12 + 1; |
8 | }
|
9 | else if (x>24) { |
10 | temp = (temp-1)%12 + 1 + 12; |
11 | }
|
12 | |
13 | x = (int) temp; |
Danke für's lesen!
Hast du dir meine Lösung angeschaut? Für die negativen Zahlen kannst du einfach modulo 12 rechnen.
Walter T. schrieb: > Vielleicht gibt es die. Aber momentan verfolge ich diese Idee weiter. Es > geht um ein Schleppzeigersystem (wie eine Uhr, die 24h auf zwei > Umdrehungen abbildet, wobei hier 0 Uhr und 24Uhr definierte Uhrzeiten > sind, bei denen beide Extremwerte gültig sind (und ihre Differenz ist > 24h, nicht 12h). Nö. Die Differenz ist exakt Null und das gilt eben IMMER - wobei es 24.00 definitiv nicht gibt, weil es eben nicht 24.00 ist, sondern eben 0.00 ist. Das, was du wohl meinst und per Modulo zu unterdrücken versuchst, ist nicht die Uhrzeit, sondern das Datum. Da liegt der Hase im Pfeffer. Frage: Ist das wieder mal ne akademische Idee von dir oder gibt es einen tatsächlich relevanten Hintergrund? W.S.
Operator S. schrieb: > Hast du dir meine Lösung angeschaut? > Für die negativen Zahlen kannst du einfach modulo 12 rechnen. Ja, die paßt auch. Ich hatte sie am Threaderstellungs-Tag einfach übersehen. W.S. schrieb: > Frage: Ist das wieder mal ne akademische Idee von dir oder gibt es einen > tatsächlich relevanten Hintergrund? Es gibt einen realen Hintergrund - und er hat nichts mit Uhren zu tun, läßt sich daran aber gut erklären. W.S. schrieb: > wobei es 24.00 > definitiv nicht gibt, weil es eben nicht 24.00 ist, sondern eben 0.00 > ist. Das ist eine Sichtweise, die nur Software-Menschen haben. Natürlich gibt es 24:00 Uhr. Heute nacht auch. Daß es mit 0:00 morgen identisch ist, ändert nicht das Geringste daran. Aber die Frage nach dem Modulo-ähnlichen Zahlensystem hat sich mittlerweile erledigt. Es war tatsächlich der Zwischenschritt zu einer besseren Lösung (eine Art sättigende Addition mit Dämpfung).
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.