Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Modulo Fließkomma
AXMD - Fr 11.03.05 23:38
Titel: Modulo Fließkomma
N'Abend :)!
Gibt es eine Möglichkeit, eine Art Modulo für Fließkommazahlen zu schreiben. Konkret geht es um folgende Anwendung: der Benutzer gibt einen Winkel in Radiant (oder Grad) ein und das Programm muss ihn < 2 Pi machen, also:
Delphi-Quelltext
1: 2:
| while winkel > 2 * Pi do winkel := winkel - 2 * Pi; |
Nachteil dieser Methode: wenn der Benutzer mal lustig ist und 999999999999 als Winkel eingibt wird er feststellen, dass das Programm fast 2min. beschäftigt ist, den Winkel herunterzurechnen. Irgendwie nicht so das Wahre... gibt's da keine bessere Lösung?
AXMD
Christian S. - Fr 11.03.05 23:56
Zum einen muss es in Deinem Quellcode IMHO winkel > 2*Pi sein, zum anderen kannst Du es so machen: winkel := frac(0.5 * winkel / pi)*2*Pi;. Hoffe, die späte Uhrzeit hat mich nicht Schwachsinn produzieren lassen ;-)
AXMD - Sa 12.03.05 09:50
Christian S. hat folgendes geschrieben: |
Zum einen muss es in Deinem Quellcode IMHO winkel > 2*Pi sein, zum anderen kannst Du es so machen: winkel := frac(0.5 * winkel / pi)*2*Pi;. Hoffe, die späte Uhrzeit hat mich nicht Schwachsinn produzieren lassen ;-) |
Hab's korrigiert. War ein Tippfehler - im echten Programm steht natürlich > ^^. Darf ich fragen, was das Frac(0,5 * winkel ....) macht?
AXMD
jasocul - Sa 12.03.05 10:27
Deine Frage irritiert mich AXMD.
Natürlich darfst du fragen. Ich hätte nur erwartet, dass du mal die OH konsultierst.
Frac gibt der den Teil nach dem Komma zurück. Trunc gibt dir das vor dem Komma.
AXMD - Sa 12.03.05 10:29
jasocul hat folgendes geschrieben: |
Deine Frage irritiert mich AXMD.
Natürlich darfst du fragen. Ich hätte nur erwartet, dass du mal die OH konsultierst.
Frac gibt der den Teil nach dem Komma zurück. Trunc gibt dir das vor dem Komma. |
Das ist mir klar :p; mir ist nur nicht klar, was das Ganze im Frac machen soll, also das
...
AXMD
jasocul - Sa 12.03.05 10:37
Achso!
Dir ging es inhaltlich um den Parameter von Frac.
Habe mir jetzt die Funktion nicht im Detail angesehen.
Im Prinzip ist das nichts anderes als Modulo. Frac ist im Prinzip der Rest eine Division. Genau wie bei Modulo.
Und wenn ich das auf die schnelle richtig interpretiere bekommst du durch den Faktor dahinter den gewünschten Wert.
Aber ich bin ehrlich: Ich habe gerade keine Lust das genau nachzuvollziehen :wink:
AXMD - Sa 12.03.05 10:39
jasocul hat folgendes geschrieben: |
Achso!
Dir ging es inhaltlich um den Parameter von Frac.
Habe mir jetzt die Funktion nicht im Detail angesehen.
Im Prinzip ist das nichts anderes als Modulo. Frac ist im Prinzip der Rest eine Division. Genau wie bei Modulo.
Und wenn ich das auf die schnelle richtig interpretiere bekommst du durch den Faktor dahinter den gewünschten Wert.
Aber ich bin ehrlich: Ich habe gerade keine Lust das genau nachzuvollziehen :wink: |
Und ich würds gern nachvollziehen, damit ich es ohne Sorgen einbauen kann ^^
AXMD
jasocul - Sa 12.03.05 10:55
Ich versuchs mal, obwohl Wochenende ist :wink:
Christian:
winkel := frac(0.5 * winkel / pi)*2*Pi;
oder
winkel := frac(winkel / (2*pi))*2*Pi;
AXMD:
while winkel > 2 * Pi do
winkel := winkel - 2 * Pi;
Jasoculs Erläuterungen (Achtung! Das ist kein Beweis!):
Du willst immer 2*Pi abziehen bis der winkel < 2*Pi ist.
Wenn du das oft genug machst, nämlich solange, wie es erfoderlich ist, kommst du zwangsläufig auf:
winkel/(2*Pi). Das kannst du mal per Hand prüfen. Taschenrechner sei erlaubt. :wink:
Da dich für deine Funktion aber der "Modulo-Rest" interessiert, musst du den Dezimal-Rest mit 2*Pi wieder multiplizieren.
Ich hoffe, dass das nachvollziehbar ist.
Bin noch nicht vollständig von gestern erholt. :beer:
EDIT:
Theoretisch müsste ein ähnliches Verfahren auch funktionieren, wenn du den eigegebenen Winkel vorher durch 360 dividierst.
wdbee - Sa 12.03.05 10:58
Einfach einen Vollkreis auf die Skala 1.0 abbilden, dann nur die Kommastellen verwenden und wieder auf Vollkreis abbilden. Das ist das, was dahinter steht. Die vollen Umdrehungen gehen dadurch verloren.
AXMD - Sa 12.03.05 11:01
Leuchtet mir irgendwie nicht ein... abgesehen davon gibt mit Frac nur den Nachkommateil zurück. Beispiel (Ergebnisse lt. Taschenrechner):
Winkel = 1234
Winkel / (2 * Pi) ergibt 196,397199775
Frac(Ans) ergibt 0,3971997754 (Ans ist 196,397..., also das letzte Ergebnis)
und das * 2Pi ergibt 2,49567979281
was wirklich dem korrekten Winkel entspricht :gruebel:
AXMD
jasocul - Sa 12.03.05 11:02
wdbee hat folgendes geschrieben: |
Einfach einen Vollkreis auf die Skala 1.0 abbilden, dann nur die Kommastellen verwenden und wieder auf Vollkreis abbilden. Das ist das, was dahinter steht. Die vollen Umdrehungen gehen dadurch verloren. |
Misst, warum bin ich nicht auf den Einheitskreis gekommen. Alkohol vernichtet offensichtlich wirklich die Gehirnzellen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!