sin x mit c berechnen

Gast #199118
Hallo,

wir müssen in der Schule den sin(x) mit Hilfe von C berechnen, wobei
der Sinus über ein Taylor-Polynom (Reihe) definiert wird.
Man soll am Schluß nur den x-Wert eingeben und das Programm soll dann
den errechneten Sinus-Wert ausgeben.

Hat irgend jemand eine Ahnung wie das geht, ich als C-Neuling bis jetzt
noch nicht.

Gruß Martin
Gast #199122
ich würde folgendes vorschlagen:

float sin(x, genauigkeit) {
  float temp;

  temp = x;
  for(int n=0;n<genauigkeit;n++) {
    temp += pow(-1,n) * (pow(x,2*n+1)/fak(2*n + 1));
  }
  return temp;
}


double fak(x) {
  double temp;
  for(int i=1;i<=x;i++) temp*=i;
  return temp;
}


nicht getestes...sollt aber hinhaun...
Gast #199123
Hallo,

hab leider die Aufgabenstellung etwas fehlintepretiert, bei mir muss
man den Wert in Grad eingeben, welcher dann ins Bogenmaß umgewandelt
wird. Unter Genauigkeit hatte ich eigentlich die Anzahl der
Rechenschritte verstanden, wenn man bei mir z.B. 30 eingibt wird 30 mal
das x^n ausgerechnet und dann abgebrochen.

Die Aufgabenstellung lautet aber: "es soll der sinus einer zahl
berechnet werden, wie das geht steht in jeder Formelsammlung!! Also
keine Standart c++ funktion benutzen, sondern ein Programm das mit
Hilfe von Funktionsaufrufen die Fakultät. die Hochzahl und den Sinus
berechnet. Diese 3 Sachen sind auszuprogrammieren!!!! Näheres gibts
Montags bzw. Donnerstags während des Praktikums!! Sinnvolles
Abruchkriterium für die Genauigkeit der Berechnung 0.000001! Das ganze
soll dann auch noch mit der in C++ Standartfunktion verglichen
werden!"

Vielleicht kann mir jemand weiterhelfen, hab mein Program mal
angehängt.

Gruß Martin
Angehängte Dateien:
Gast #199125
@tobi, sieht mal nicht schlecht aus, muss man bei dir den x-Wert in
Radiant oder in Grad eingeben?

weißt du wie das mit der Genauigkeitsabfrage am Anfang gehen könnte,
also z.B. Genauigkeit von 0,001 ?
Gast #199126
die genauigkeit könnte man evtl dadruch machen, dass man die differenz
von 2 aufeinanderfolgenden ergebnissen berechnet und diese mit einer
vorgegebenen genauigkeit vergleicht.
allerdings solltest du nicht mehr als die benutzten 20 durchläufe
machen, da die fakultät sonst zu gross wird und falsche ergebnisse
kommen (deswegen hab ich schon __int64 benutzt)

das ergebnis ist in rad
Gast #199127
Hi

du wirst doch hier nicht deine Hausaufgaben vom Forum machen lassen.
Wenn das mal dein Tutor erfährt :-)

Die Genauigkeit ergibt sich aus dem Term den du immer wieder
dazuaddierst/subtrahierst. Also das x^n/n!. Wenn dieser Wert kleiner
als die geforderte Ganauigkeit ist hast du die benötigte Genauigkeit
erreicht.


Matthias
Gast #199128
Moin,

nur mal so zur Info. In der Praxis wird der sin(x) durch ein Polynom
(z.B. ax^2+bx+c)approximiert. Dazu reicht es aus, ein Polynom mit
hinreichender Genauigkeit im Bereeich von [0..pi/2] zu finden. Der Rest
wird durch Spiegelung und Verschiebung berechnet. Das Polynom wird nach
dem Horner-Schema(nur Multiplikationen, keine Potenzen) berechnet.
Hoffentlich wars das Hornerschema?! Ist schon so lange her ;-)

Grüße
Oliver
Gast #199129
"du wirst doch hier nicht deine Hausaufgaben vom Forum machen lassen.
Wenn das mal dein Tutor erfährt :-)"

ich hab auch nur meine hausaufgaben gepostet ;)

"Das Polynom wird nach dem Horner-Schema(nur Multiplikationen, keine
Potenzen) berechnet.Hoffentlich wars das Hornerschema?!"

jep, war es. hast du irgendwo einen guten link, der dieses verfahren
mit den polynomen genauer erklärt?
Gast #199132
Hi

simple Interpolation mittels Polynom. Du legst drei Punkte auf die
Sinuskurve von 0 bis pi/2 und interpolierst die mit einem Polynom
zweiten Grades.

Matthias
Gast #199133
"Irgendwie so z.B.:

ax^3+bx^2+cx+d = ((ax+b)x+c)x+d"


Ja so gehts; einfach die Potenzen sukkesiv ausklammern. Ist nicht nur
schneller, sondern bringt auch wesentlich geringere Rundungsfehler.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.