Autor |
Beitrag |
gilSolo
| Veröffentlicht am Sonntag, den 20. Januar, 2002 - 14:31: |
|
Hallo, Ich brauche umbedingt eure Hilfe. Ich muss sin^-1 ohne Taschenrechner rechnen. An meinem Schultaschenrechner muss ich nur Shift und dann sin drücken, danach erhalte ich das ergebnis. Ich muss aber einen Taschenrechner für Informatik programmieren und scheitere daran, dass ich nicht weis, wie ich sen "umgekehrten" Sinus berechnen kann. Ich Danke schon im Voraus Gil |
Ulf (Silverhawk)
| Veröffentlicht am Montag, den 21. Januar, 2002 - 12:24: |
|
Hi Gil, die Umkehrfunktion von sin(x) heißt arcsin(x) schau doch einfach mal nach, ob es in der Programmiersprache nicht auch eine solche Funktion gibt ... Gruß Ulf |
Beach
| Veröffentlicht am Dienstag, den 22. Januar, 2002 - 12:11: |
|
Hallo Gil, die Funktion arcsin(x) kann durch eine Potenzreihenentwicklung dargestellt werden (auf die Theorie, warum das so ist, möchte ich hier nicht näher zurückgehen): arcsin(x) = Sn=0oo [ x2n+1/(2n+1) * ( Pm=1n (2m-1)/(2m) ) ] Die für diesen Zweck umgeformt wird in: arcsin(x) = Sn=0oo [ x/(2n+1) * ( Pm=1n (2m-1)/(2m) * x² ) ] was sich dann in der Sprache c etwa durch das ausdrücken lässt, was nicht blau ist: #include <iostream.h> // Funktion Arcsin(x) errechnen ///////////////////////////////////////////////////////////////////// float arcsin(float x) { float z,y=0; int m,n=0; while(n < 1000) // hiermit wird festgelegt, wieviel Summationen gemacht werden, d.h. wie genau das Ergebnis wird, je größer n werden darf, um so länger dauert natürlich die Rechnung { m=1; z=1; while( m < n+1 ) { z = z * ( 2*m-1 )/( 2*m ) *x *x; m++; } z=z*x/(2*n+1); y=y+z; n++; } return y; } ///////////////////////////////////////////////////////////////////// void main(void) { float x,y; cout << "Dieses Programm kann Näherungswerte von arcsin(x) bestimmen, und" << endl << "solange die Werte von x kleiner als 0.99 sind, sogar auf 10^-6 genau." << endl << endl; cout << "bitte das x eingeben, von dem arcsin(x) berechnet werden soll: " << endl; cin >> x; y=arcsin(x); cout << "arcsin(" << x << ") = " << y << endl; } Da die Reihe nur für x £ 1 konvergiert und für x>1 rasch divergiert, und demnach für x=1 nur sehr langsam konvergiert, erfordert die Näherung an den Funktionswert um so mehr Summationen, je näher das x an 1 liegt. Für den Fall, dass z.B. |1-x| < 0.05 gilt, würde ich empfehlen, zu "pfuschen" und eine Abfrage einzubauen, die bei dieser Situation einfach p/2 als Funktionswert ausgibt. |
|