Python, distanz zweier Nachkommerstellen ohne Übertrag

Gast #4125112
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
Gast #4125210
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.)
Gast #4125211
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
Gast #4125220
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
Gast #4125229
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...
Gast #4125235
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 
:)
Moderator #4125574
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.
Gast #4126038
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
Gast #4135045
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?
Moderator #4135096
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren