Forum: Compiler & IDEs Zyklisches Zahlensystem: Begrenzen auf Wertebereich


von Walter T. (nicolas)


Lesenswert?

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.

von Der Andere (Gast)


Lesenswert?

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.

von Operator S. (smkr)


Lesenswert?

ist O(37) = 13?

Bringe noch ein paar Werte, ich denke mit modulo(12) und einem Offset 
kommst du weiter

von Der Andere (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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
von Operator S. (smkr)


Lesenswert?

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

von Amateur (Gast)


Lesenswert?

Ein Zahlensystem, bei dem eine Position zweifach belegt ist, bekommt von 
mir null Punkte.

von Der Andere (Gast)


Lesenswert?

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

von Walter T. (nicolas)


Angehängte Dateien:

Lesenswert?

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
von Fabian O. (xfr)


Lesenswert?

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
}

von Walter T. (nicolas)


Lesenswert?

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!

von Operator S. (smkr)


Lesenswert?

Hast du dir meine Lösung angeschaut?
Für die negativen Zahlen kannst du einfach modulo 12 rechnen.

von W.S. (Gast)


Lesenswert?

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.

von Walter T. (nicolas)


Lesenswert?

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
Noch kein Account? Hier anmelden.