Sinus Cosinus Speedvergleich Berechnung vs. Lookup
Übersicht

![]() |
BobBetreff: Sinus Cosinus Speedvergleich Berechnung vs. Lookup |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
da ich in einem Projekt exessiven Gebrauch von Sin und Cos Funktionen mache, habe ich mal einen kleinen Speedtest zwischen der Berechnung der Werte und einer Lookup Tabelle (Dim Feld) veranstalltet. Das Lookup ist gut 50% schneller. (Hätte ich nicht gedacht.) Allerdings ist fraglich ob das Lookup dennoch notwendig ist da hier immerhin 18.000.360 mal ein Wert ausgelesen wird. Auf meiner Schleuder beträgt die differenz NUR ca. 2,5 Sekunden. Seis drum. Für alle die es >Interessiert wie man auch noch den letzten Frame aus der Kiste Kitzeln kann hier der Code. Gruß von Bob Code: [AUSKLAPPEN] ; Sinus Cosinus Speed Test
Graphics 640,480,16 Dim sin2#(359) Dim Cos2#(359) For i = 0 To 359 sin2(I) = Sin(I) cos2(I) = cos(I) ;DebugLog Sin2(i) + " " + Cos2(i) Next Text 0,0, "Bitte warten" stop1 =0 stop2 = 0 ;Zeiterfassung unmittelbar vor der Schleife oldtime1 = MilliSecs() For i = 0 To 50000 For j = 0 To 359 xxx# = Sin(J) yyy# = Cos(J) Next Next stop1 = MilliSecs() - oldtime1 Cls Text 0,0, "Berechnung mit Sin Cos dauerte " + stop1 ;Zeiterfassung unmittelbar For (kleiner gag) der Schleife oldtime2 = MilliSecs() For i = 0 To 50000 For j = 0 To 359 xxx# = Sin2(J) yyy# = Cos2(J) Next Next stop2 = MilliSecs() - oldtime2 cls While Not KeyHit(1) Text 0,0, "Berechnung mit Sin Cos dauerte " + stop1 Text 0,20, "Lookup mit Sin Cos dauerte " + stop2 Text 0,40, "Für Zufallsvergleich Taste 1" If KeyHit(2) Then xxx = Rand(0,359) cls If Rand (0,1) = 1 Then Text 0,60, "Sinus vergleich Ber. / Lookup " + Sin(xxx) + " / " + sin2(xxx) Else Text 0,60, "Cosinus vergleich Ber. / Lookup " + Sin(xxx) + " / " + sin2(xxx) EndIf EndIf Wend End |
||
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du musst schon selbst entscheiden wann es sinnvoller ist... Manchmal ist es sogar so, dass sin/cos oft gebraucht wird, aber eine tabelle nicht ausreicht, weil man deutlich genauere Gradwere übergeben will...
Berechnung von Sin/Cos ist einfach ganz schon "kompliziert", wärend eine Tabelle nur dumme zahlenschieberei ist... |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
Bob |
![]() Antworten mit Zitat ![]() |
---|---|---|
TheShadow hat Folgendes geschrieben: Du musst schon selbst entscheiden wann es sinnvoller ist...
Genau das werd ich auch. ![]() Ich werde die Berechnungen in dem Projekt machen weil ich float Werte übergebe. Nichts desto Trotz dürfte das Dim Feld für einfache 2D Jump 'n Run ausreichen. Ich wollt's halt nur mal genau wissen. (Grundlagenforschung ist nie verkehrt) Gruß Bob |
||
darkshadow |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn ich mich nicht irre und meine ehemalige Mathematiklehrerin mich und die gesammte Klasse nicht angelogen hat, dann kann man sich sogar die Cos Berechnug sparen ![]() Cos von X = Sin von X - PI oder so in etwa war es.. Aber auf solche minimalen Speedunterschiede bei der Vorberechnung der Tabelle sind wir ja nicht unbedingt angewiesen.. ![]() |
||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
wohl eher doch nur "oder so in etwa" weil Cosinus und Sinus Funktionen sind, die einen Wert von -1 bis 1 liefern, und PI ist 3.1415926535897932384626433832795, wenn du das subtrahierst fällst du also 100% aus dem Bereich -1 bis 1 raus. | ||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Gossi |
![]() Antworten mit Zitat ![]() |
---|---|---|
darkshadow meint, dass Cos um eine halbe Periode verschoben ist, da PI 180° entspricht. Außerdem hat er recht, wenn er im Grad-Maß, stett im Bogenmaß rechnet. Im Bogenmaß muss man nicht PI, sondern im Parameter 180 abziehen. | ||
Alle Wasser laufen ins Meer, doch wird das Meer nicht voller; an den Ort, dahin sie fließen, fließen sie immer wieder. (...) Was geschehen ist, eben das wird hernach sein. Was man getan hat, eben das tut man hernach wieder, und es geschieht nichts neues unter der Sonne. Geschieht etwas, von dem man sagen könnte: "Sieh, das ist neu"? Es ist längst vorher auch geschehen in den Zeiten, die vor uns gewesen sind. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gossi: Jup schon klar, aber ob man nun Cos berechnet oder Sin-180° spielt keine Rolle von der Geschwindigkeit her, weil ja beide Funktionen berechnet werden. DS hingegen meinte, nur eine Funktion berechnen lassen und die andere davon ableiten, was aber eben schwierig wird... | ||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
was is daran genau schwer?
sin(alpha) = cos(alpha - 90 ) bzw. sin(bogen) = cos(bogen - PI/2 ) wenn du mit lookup arbeitest, erspart dir das eine tabelle |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dreamora hat Folgendes geschrieben: was is daran genau schwer?
sin(alpha) = cos(alpha - 90 ) bzw. sin(bogen) = cos(bogen - PI/2 ) wenn du mit lookup arbeitest, erspart dir das eine tabelle Schon klar, aber du benutzt immer noch in beiden Fällen 2 Funktionen. Und so wie ich DS verstanden habe versucht er mir nur einer Funktion die Werte von Sinus und Cosinus auszurechnen. So in der Art: Sin(60°) - Irgendwas = Cos(60°) Was dann bedeuten würde, dass man bei einer Sin/Cos-Steuerung in einem Spiel statt Code: [AUSKLAPPEN] xPlus = Cos( Winkel ) yPlus = Sin( Winkel ) sowas schreiben könnte: Code: [AUSKLAPPEN] xPlus = Cos( Winkel ) yPlus = xPlus - irgendwas Wie du siehst würde hier auf eine Funktion ganz verzichtet, aber eben - mit diesem Ansatz kommst du nicht so schnell an eine funktionierende Lösung (wahrscheinlich gar nicht). |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du verstehst genau 0 von Trigonometrie, stimmts?
das "- irgendwas" muss IN der klammer sein net ausserhalb! Das heisst, wenn du Cos(x) willst, kannste gerade so gut Sin(x + 90) ausrechnen. Im Endeffekt kommt das nicht wirklich draufan, da beide +- gleich lange brauchen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dreamora hat Folgendes geschrieben: du verstehst genau 0 von Trigonometrie, stimmts?
das "- irgendwas" muss IN der klammer sein net ausserhalb! Das heisst, wenn du Cos(x) willst, kannste gerade so gut Sin(x + 90) ausrechnen. Im Endeffekt kommt das nicht wirklich draufan, da beide +- gleich lange brauchen. Ah du Birä! Das ist genau das was ich Sagen will es geht nicht mit nur einer Funktion ![]() Wenn du den Wert von Sinus und Cosinus haben willst kommst du nicht drumherum 2 Mal eine trig. Funktion aufzurufen. Ob du nun Sin( Winkel ) und Sin( Winkel - 90° ) rechnest oder Sin( Winkel ) und Cos( Winkel ) spielt da absolut null Rolle. Zeigt mal wieder wos überall zu verständigungs-Problemen führen kann und deren Folgen... Ob ich DS richtig verstanden hab ist mir mittlerweile wurscht ![]() PS: Von Trigonometrie hab ich sehr wohl ne Ahnung ![]() |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Es gibt trigonometrische Möglichkeiten um das Umzuwandeln. Sind im Netz zu finden, entweder als Trigonometrie II / III oder Goniometrie. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja aber das bringt keine Geschwindigkeitsvorteile ![]() |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
aha bringts nicht wenn du aus Sin x * Cos x bzw. Sin x + Cos x etwas machen kannst was zb sin( 2*x) oder so sein könnte?
Wusste erst net was du mit deinem Text genau meinst wegen "2 Funktionen" deshalb die andere antwort |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dreamora hat Folgendes geschrieben: aha bringts nicht wenn du aus Sin x * Cos x bzw. Sin x + Cos x etwas machen kannst was zb sin( 2*x) oder so sein könnte?
Wusste erst net was du mit deinem Text genau meinst wegen "2 Funktionen" deshalb die andere antwort Doch dann würde es etwas bringen, weil ja eine Funktion wegfallen würde (Mit Funktionen meine ich Sin/Cos)... |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
darkshadow |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was ich gemeint habe ist, dass ich den Wert eines Winkels mit Sin berechne.. Ihn speicher und einfach eine halbe Periode (PI) von ihm abziehe.. Da ist doch dann nix weiter, wo ich Cos brauch.. oder?! ![]() Ich hab das hier nur rasch alles überflogen, da ich keine Lust auf diese egozentrischen Texte genaustens zu studieren.. ![]() |
||
zocker2150 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bringt doch eigendlich auch nix.
Da du für den cos(x) dann halt sin(x + PI/2) schreibst mach doch kein Rechenunterschied bzw. es bringt keinerlei Geschwindigkeitsvorteile. Die einzige möglichkeit die sin(x)/cos(x) Funktionen zum umgehen wäre mit einer Taylor-Entwicklung. Was jedoch höchst warscheinlich langsamer ist ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
jo wärs definitiv, da es nicht für die praktische anwendung ausgelegt ist. | ||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group