Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#include <iostream> #include <ctime> #include <cmath> using namespace std; float FastSin0(const float& fAngle) { float fASqr = fAngle*fAngle; float fResult = 7.61e-03f; fResult *= fASqr; fResult -= 1.6605e-01f; fResult *= fASqr; fResult += 1.0f; fResult *= fAngle; return fResult; } int main(void) { long start, ende; float a1, a2, a3, a4; start = clock(); for(float i=0.0f; i<360.0f; i=i+0.0001f) FastSin0(i); ende = clock(); a2 = float(ende-start); cout<<"FastSin0 fertig"<<endl; start = clock(); for(float i=0.0f; i<360.0f; i=i+0.0001f) sinf(i); ende = clock(); a3 = float(ende-start); cout<<"sinf fertig"<<endl; start = clock(); for(float i=0.0f; i<360.0f; i=i+0.0001f) sin(i); ende = clock(); a4 = float(ende-start); cout<<"sin fertig"<<endl; cout<<"sinf: "<<a3/CLOCKS_PER_SEC<<" entspricht: "<<a3/a3*100<<"%"<<endl; cout<<"sin: "<<a4/CLOCKS_PER_SEC<<" entspricht: "<<a3/a4*100<<"%"<<endl; cout<<"FastSin0: "<<a2/CLOCKS_PER_SEC<<" entspricht: "<<a3/a2*100<<"%"<<endl; return 0; } |
Zitat
FastSin0 fertig
sinf fertig
sin fertig
sinf: 0.39 entspricht: 100%
sin: 0.5 entspricht: 78%
FastSin0: 0.313 entspricht: 124.601%
Drücken Sie eine beliebige Taste . . .
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
float FastSin1(float fAngle) { float fASqr = fAngle*fAngle; floaz fResult = -2.39e-08f; fResult *= fASqr; fResult += 2.7526e-06f; fResult *= fASqr; fResult -= 1.98409e-04f; fResult *= fASqr; fResult += 8.3333315e-03f; fResult *= fASqr; fResult -= 1.666666664e-01f; fResult *= fASqr; fResult += 1.0f; fResult *= fAngle; return fResult; } |
Anonymous
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 |
const float sintab[90] = { ... 90 korrekte Sinus-Werte (vorberechnet) ... }; float mysin(float w) { int wi = (int)floor(w); float s1 = sintab[wi]; float s2 = sintab[wi+1]; return (s2-s1)/(w-wi)+s1; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
float TnSin(float x, unsigned short n) { float Tn = 0; for (unsigned short k = 0; k<n; k++) Tn += (DerivativeSinX0(k) / fac(k)) * pow(x, k); return Tn; } float DerivativeSinX0(unsigned short k) { while (k>3) k -= 4; switch(k) { case 0: return 0; //sin 0 case 1: return 1; //cos 0 case 2: return 0; //-sin 0 case 3: return -1; //-cos 0 } } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
#include <iostream> #include <ctime> #include <cmath> using namespace std; float FastSin0(const float& fAngle) { float fASqr = fAngle*fAngle; float fResult = 7.61e-03f; fResult *= fASqr; fResult -= 1.6605e-01f; fResult *= fASqr; fResult += 1.0f; fResult *= fAngle; return fResult; } float FastSin1(const float& fAngle) { float fASqr = fAngle*fAngle; float fResult = -2.39e-08; fResult *= fASqr; fResult += 2.7526e-06f; fResult *= fASqr; fResult -= 1.98409e-04f; fResult *= fASqr; fResult += 8.3333315e-03f; fResult *= fASqr; fResult -= 1.666666664e-01f; fResult *= fASqr; fResult += 1.0f; fResult *= fAngle; return fResult; } int main(void) { long start, ende; float a1, a2, a3, a4; float pi = atan(1.0f)*2.0f; //da nur halbes pi korrekt start = clock(); for(float i=0.0f; i<pi; i=i+0.000001f) FastSin0(i); ende = clock(); a1 = float(ende-start); cout<<"FastSin0 fertig"<<endl; start = clock(); for(float i=0.0f; i<pi; i=i+0.000001f) FastSin1(i); ende = clock(); a2 = float(ende-start); cout<<"FastSin1 fertig"<<endl; start = clock(); for(float i=0.0f; i<pi; i=i+0.000001f) sinf(i); ende = clock(); a3 = float(ende-start); cout<<"sinf fertig"<<endl; start = clock(); for(float i=0.0f; i<pi; i=i+0.000001f) sin(i); ende = clock(); a4 = float(ende-start); cout<<"sin fertig"<<endl; cout<<"sinf: "<<a3/CLOCKS_PER_SEC<<" entspricht: "<<a3/a3*100<<"%"<<endl; cout<<"sin: "<<a4/CLOCKS_PER_SEC<<" entspricht: "<<a3/a4*100<<"%"<<endl; cout<<"FastSin0: "<<a2/CLOCKS_PER_SEC<<" entspricht: "<<a3/a1*100<<"%"<<endl; cout<<"FastSin1: "<<a2/CLOCKS_PER_SEC<<" entspricht: "<<a3/a2*100<<"%"<<endl; return 0; } |
Interessanterweise sind sin und fastSin1 immer gleichschnell, nur zur taylorentwicklung, wie viele glieder sollten es denn mindestens sein?Zitat
FastSin0 fertig
FastSin1 fertig
sinf fertig
sin fertig
sinf: 0.172 entspricht: 100%
sin: 0.219 entspricht: 78.5388%
FastSin0: 0.219 entspricht: 122.857%
FastSin1: 0.219 entspricht: 78.5388%
Drücken Sie eine beliebige Taste . . .
Zitat von »"CW_Kovok"«
2 Probleme: erstens ungenau, zweitens speicheranfällig, für hohe genauigkeit muss die lookuptabelle sehr genau sein
Werbeanzeige