Hallo zusammen,
ich habe ein kleines Programmier-Mathematisches Problem.
Ich möchte gerne Zahlen innerhalb eines Wertebreiches haben. Beispielsweise Rotation für einen Kreis.
Ich möchte erreichen, dass Wertebreiche zwischen 0 und 360 etwa liegen. Bei „höheren“ Werten ist klar, dass ich Modulo rechnen kann. Aber gibt es auch eine Rechenfunktion, die -10 auf 350 überträgt, ohne abfragen zu müssen, ob Wert
Ich vermute mal, du programmierst mit Java:
if (wert
So dürfte es funktionieren.
Oder
wert%=360;
if(wert
oder auch
wert = (wert
Wenn du gar keine (direkte) Abfrage haben möchtest, könnte man höchstens schummeln:
wert = (wert%360) + Math.signum(-wert)\*180+180;
Dann funktioniert es aber für 0 nicht mehr :frowning:
Aber wäre ein Bereich zwischen 0 und 359 nicht sinnvoller?
mfg,
Ché Netzer
Ich möchte erreichen, dass Wertebreiche zwischen 0 und 360
etwa liegen. Bei „höheren“ Werten ist klar, dass ich Modulo
rechnen kann. Aber gibt es auch eine Rechenfunktion, die -10
auf 350 überträgt, ohne abfragen zu müssen, ob Wert
Hallo hendrik,
x = arcsin(sin(x))
oder
x = arccos(cos(x))
Mag zwar mathematisch schön sein, aber braucht wesentlich mehr Rehenzit als Modulo.
Probiers mal aus, vielleicht klappt es. Hängt davon ab, wie die
trigonometrischen Funktionen in der Programmiersprache, die du
verwendest, geschrieben sind.
Die meisten Programmiersprachen verwenden rad, da muss man zusätzlich noch umrechnen.
MfG Peter(TOO)
Danke für eure schnelle Hilfe.
Ja, das mit den 360 „Grad“ war nur ein Beispiel.
Aber ich sehe schon, so wirklich gut ist das alles nicht. Letztlich siehts vielleicht nicht so elegant aus, aber ich schätze mal, die Abfrage, ob der Wert
Mag zwar mathematisch schön sein, aber braucht wesentlich mehr
Rehenzit als Modulo.
Das stimmt. Vermutlich sind die trigonometrischen Funktionen in den meisten Programmiersprachen mit Hilfe von Taylorpolynomen geschrieben.
Die meisten Programmiersprachen verwenden rad, da muss man
zusätzlich noch umrechnen.
Ja, mir ist auch noch keine Programmiersprache über den Weg gelaufen, die nicht im Bogenmaß rechnet.
So eine Abfrage auf Negativität kostet fast nichts, und modulo rechnen kann der Computer gut und schnell. Ich denke, da wirst du keinen günstigeren Weg finden.
Gruß,
hendrik
Nordsprung relevant?
Hallo Tobias,
falls Du da irgendwo in Deiner Berechnung einen Mittelwert bildest, solltest Du unbedingt das „Nordsprung“-Problem vergegenwärtigen ( siehe Wikipedia ).
Ohne weitere Maßnahmen addieren sich nämlich +10° und -10° zu 180°…
Freundliche Grüße
Thomas
Hallo hendrik,
Das stimmt. Vermutlich sind die trigonometrischen Funktionen
in den meisten Programmiersprachen mit Hilfe von
Taylorpolynomen geschrieben.
Sind sie.
Wobe sich schon Generationen von Mathematikern/Programmierern damit befasst haben, die Reihen, z.B. mit überhöhten Exponenten, abzukürzen.
Bei Floating-Point hat die Mantisse eine feste und vorgegebene Stellenzahl.
MfG Peter(TOO)
Hi…
Ich möchte erreichen, dass Wertebreiche zwischen 0 und 360
etwa liegen. Bei „höheren“ Werten ist klar, dass ich Modulo
rechnen kann. Aber gibt es auch eine Rechenfunktion, die -10
auf 350 überträgt, ohne abfragen zu müssen, ob Wert = -360n. Dann genügt es, ohne Notwendigkeitsprüfung vor der Modulo-Rechnung pauschal 360n zu addieren.
genumi
Hallo.
Ich hätte da noch
((x % 360) + 360) % 360
zu bieten.
Sebastian.
Hätte ich auch angeboten. If-Abfragen sind evtl. schneller, als eine Formel ist dieses kürzer.
Gruß Lutz
Wow, vielen, vielen Dank für all die interessanten Posts. Auch wenn ich begeistert bin von euren Lösungen und Ideen, so habt ihr vermutlich leider Recht damit, dass der Code mit if-Abfragen zwar länger wird, aber vermutlich schneller bleibt, als wenn ich ständig Cosinus-Berechnungen mache.
Schade, ich dachte, da gäbe es einen coolen Weg, abgesehen davon, ist auch das Beispiel mit den 360° nur eines der Beispiele und sollte nicht zwingend auf Kreisberechnung hinauslaufen. Vielmehr ging es mir darum, dass zyklische Angaben bei Modulo leider nur mit Addition, nicht aber Subtraktion funktionieren. Das fand ich irgendwie „verbesserungswürdig“, aber offenbar gibts da keine ebenso schöne „Formel“.
Nun denn, ihr habt mir weitergeholfen, das zählt.
Vielen Dank euch allen,
Tobias