Forum: PC-Programmierung Python, distanz zweier Nachkommerstellen ohne Übertrag


von Chrisitan (Gast)


Lesenswert?

Hallo,

ich komm einfach nicht drauf. Ich möchte die Distanz zweier 
Nachkommerstellen berechnen dabei soll der Übertrag vernachlässigt 
werden. Es geht also nur um die Nachkommerstelle.

Bspl:

0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1

Gibt es da irgend ein Term für den ich suchen muss?

Bin für jeden Hinweis dankbar,

Christian

von Tom (Gast)


Lesenswert?

Differenz bilden und mit math.modf die Vorkommastellen wegwerfen?

von Rene H. (Gast)


Lesenswert?

Tom schrieb:
> Differenz bilden und mit math.modf die Vorkommastellen wegwerfen?

Das geht so nicht. Ich habe mir das auch einfacher gedacht und studiere 
immer noch darüber.

von Salewski (Gast)


Lesenswert?

Rene H. schrieb:
> Ich habe mir das auch einfacher gedacht

Na grundsätzlich ist das doch recht einfach: Die beiden Zahlen mit 10 
multiplizieren, Nachkommateil abschneiden, Mod 10, dann Differenz, 
Differenz womöglich Absolutwert und Mod 5, und als Letztes noch durch 10 
teilen. Sind natürlich einige Schritte, alles mit einem Befehl wäre 
schöner. (Ich kann das jetzt nicht so mal schnell in Python 
hinschreiben, da ich eher Ruby verwende.)

von Chrisitan (Gast)


Lesenswert?

So, ich habe jetzt seit einigen Stunden drüber gegrübelt und 
letztendendes eine sehr simple Lösung gefunden. Schon fast zu banal! 
Vielleicht kann man es noch vereinfachen, aber hier ist meine Lösung:

def distance(x,y):
...   '''x und y sind Nachkommastellen'''
...   if abs(x-y)>0.5:
...     if x>y:
...       return y+1-x
...     else:
...       return x+1-y
...   else:
...     if x>y:
...       return x-y
...     else:
...       return y-x

Danke fürs mitknobeln. Endlich kann ich schlafen.

Gruss Christian

von Salewski (Gast)


Lesenswert?

# Ruby
def diff(a, b)
  a = (a * 10).to_i % 10
  b = (b * 10).to_i % 10
  ((a - b).abs % 6).fdiv(10)
end

puts diff(7.1, 5.4), 0.3
puts diff(5.4, 7.1), 0.3
puts diff(5.9, 7.1), 0.2
puts diff(5.9, 2.4), 0.5

von Christian (Gast)


Lesenswert?

>
> def distance(x,y):
> ...   '''x und y sind Nachkommastellen'''
> ...   if abs(x-y)>0.5:
> ...     if x>y:
> ...       return y+1-x
> ...     else:
> ...       return x+1-y
> ...   else:
> ...     if x>y:
> ...       return x-y
> ...     else:
> ...       return y-x
>
Der äussere else Zweig lässt sich natürlich auf "return abs(x-y)" 
kürzen...

Salewski schrieb:
> # Ruby
> def diff(a, b)
>   a = (a * 10).to_i % 10
>   b = (b * 10).to_i % 10
>   ((a - b).abs % 6).fdiv(10)
> end
>
> puts diff(7.1, 5.4), 0.3
> puts diff(5.4, 7.1), 0.3
> puts diff(5.9, 7.1), 0.2
> puts diff(5.9, 2.4), 0.5

sehr gut, danke...

von spontan (Gast)


Lesenswert?

>Bspl:
>
>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1

Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?

Warum herrscht nicht der Abstand 0.8?

von Christian (Gast)


Lesenswert?

spontan schrieb:
>>Bspl:
>>
>>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1
>
> Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?
>
> Warum herrscht nicht der Abstand 0.8?

der geringste Abstand war gesucht... so jetzt schlaf ich aber wirklich 
:)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Oder so:
1
def distance(x,y):
2
  return 0.5 - abs(abs(x - y) - 0.5)

von Salewski (Gast)


Lesenswert?

Yalu X. schrieb:
> Oder so:

Naja, ich hatte beliebige Vorkommastellen angenommen -- aber das war 
wohl gar nicht gefordert.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Salewski schrieb:
> Naja, ich hatte beliebige Vorkommastellen angenommen -- aber das war
> wohl gar nicht gefordert.

Zumindest in der von Chrisitan selbst gefundenen Lösung werden die
Vorkommastellen ebenfalls nicht berücksichtigt:

Chrisitan schrieb:
> def distance(x,y):
> ...   '''x und y sind Nachkommastellen'''
> ...   if abs(x-y)>0.5:
> ...     if x>y:
> ...       return y+1-x
> ...     else:
> ...       return x+1-y
> ...   else:
> ...     if x>y:
> ...       return x-y
> ...     else:
> ...       return y-x

Mein Vorschlag in meinem letzten Beitrag tut fast dasselbe, nur dass die
Fallunterscheidungen nicht explizit, sondern versteckt in den beiden
abs-Aufrufen stattfinden.

von Christian (Gast)


Lesenswert?

Nein, die Vorkommastellen müssen nicht berücksichtigt weden. Dennoch 
finde ich die beiden letztgenannten Lösungen von Yalu und Salewski 
super.

Ist für mich super gelaufen: A) Ich habe selber eine Lösung meines 
Problems gefunden.(Und hätte ich mich geärgert, wenn mir gezeigt werden 
müsste wie einfach es geht!). Und B) ich hab trozdem was gelernt, es 
ging nämlich noch viel eleganter :)

Danke an alle Beteiligten

Christian

von Da D. (dieter)


Lesenswert?

Salewski schrieb:
> def diff(a, b)
>   a = (a * 10).to_i % 10
>   b = (b * 10).to_i % 10
>   ((a - b).abs % 6).fdiv(10)
> end

Die kürzeste Lösung ist nicht automatisch die Beste. Die beste Lösung, 
ist die gut lesbare!

von Tek (Gast)


Lesenswert?

spontan schrieb:
>>Bspl:
>>
>>0.9 und 0.1 haben einen Abstand von 0.2 --> da (0.9+0.2)%1 = 0.1
>
> Wie lautet denn das Regelwerk, nach dem der Abstand bestimmt wird?
>
> Warum herrscht nicht der Abstand 0.8?

hätt ich jetzt auch vermutet. Kann das mal einer erläutern wieso sich 
das "Abstand" nennt?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Stell die die Zahlenwerte 0≤x<1 auf einem Kreis aufgetragen vor:

1
         0,3    0,2
2
         __________        
3
    0,4 /          \ 0,1   \
4
       /            \       |
5
      |              |      |
6
  0,5 |              | 0,0  | 0,2
7
      |              |      |
8
       \            /       |
9
    0,6 \__________/ 0,9  |/
10
11
         0,7    0,8

Der Abstand zwischen 0,9 und 0,1 entlang des Kreisumfangs ist 0,8 oder
0,2, je nachdem, ob man im Gegenuhrzeiger- oder im Uhrzeigersinn misst.
Hier ist der kürzere der beiden möglichen Abstände gesucht, also 0,2.

von Tek (Gast)


Lesenswert?

Ah, dank Dir. Jetzt ist es klar!

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.