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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.