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
Differenz bilden und mit math.modf die Vorkommastellen wegwerfen?
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.
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.)
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
# 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
> > 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...
>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?
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 :)
Oder so:
1 | def distance(x,y): |
2 | return 0.5 - abs(abs(x - y) - 0.5) |
Yalu X. schrieb: > Oder so: Naja, ich hatte beliebige Vorkommastellen angenommen -- aber das war wohl gar nicht gefordert.
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.
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
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!
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?
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.
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.