n-te Partialsumme von Sinus < C/C++ < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 00:13 Do 16.05.2013 | Autor: | Marschal |
Aufgabe | Hi!
Ich soll eine Funktion mysin schreiben, die die n-te Partialsumme der Potenzreihe von Sinus für ein Wert x berechnet.
Dazu sollen Funktionen geschrieben werden, die das Vorzeichen eines Summanden ausgeben können und ein Programm für die Fakultät. |
Was mache ich falsch, dass das Programm so abstruse Werte ausspuckt?
Ich habe im Anhang mein Quellcode sowohl als Bild, als auch als .txt-Datei
Vielen Dank im Voraus!
Quellcode als Bild
Die .txt-Datei ist in der Mitteilung!!! Sorry war durcheinander gekommen!
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich] Anhang Nr. 2 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:24 Do 16.05.2013 | Autor: | Marschal |
Datei-Anhang
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:00 Do 16.05.2013 | Autor: | chrisno |
Du kannst Quellecode mit [code] [/code] direkt einfügen.
Warum berechnest Du bei jedem Summanden [mm] $x^3$ [/mm] ?
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:22 Do 16.05.2013 | Autor: | Marschal |
Hi chrisno!
Also die Partialsumme ist ja $ [mm] \sin [/mm] (x) [mm] \approx \sum_{i=0}^n (-1)^i\frac{x^{2i+1}}{(2i+1)!} [/mm] $
und bei jedem neuen Summanden wird doch aus dem alten $ x $ ein $ [mm] x^3$ [/mm] , oder liege ich da falsch?
|
|
|
|
|
> Also die Partialsumme ist ja [mm]\sin (x) \approx \sum_{i=0}^n (-1)^i\frac{x^{2i+1}}{(2i+1)!}[/mm]
>
> und bei jedem neuen Summanden wird doch aus dem alten [mm]x[/mm] ein
> [mm]x^3[/mm] , oder liege ich da falsch?
Ja.
Für i=0 hast du $x$.
Für i=1 hast du [mm] $x^3$.
[/mm]
Für i=2 hast du [mm] $x^5$.
[/mm]
.
.
.
.
.
Valerie
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:34 Do 16.05.2013 | Autor: | Marschal |
Ok danke Valerie!
1: | double mysin (double x, int n)
| 2: | {
| 3: | int i;
| 4: | double mysin = 0.;
| 5: |
| 6: | for(i=0; i <= n; ++i)
| 7: | mysin += vorzeichen((double) i ) * ( x = x*x*x )/( fakultaet(2*i+1) );
| 8: | return mysin;
| 9: | } |
Aber chrisno deutete an, dass damit etwas nicht stimmt... Nur was?
PS: Die Funktion "vorzeichen" gibt eigentlich eine Integer-Zahl aus. Habe ich das in Zeile 7 so richtig gemacht, dass sie eine double-Zahl ausgibt, wenn ich einfach so mache: vorzeichen((double) i ) ?
|
|
|
|
|
> Ok danke Valerie!
>
> 1: | double mysin (double x, int n)
| 2: | > {
| 3: | > int i;
| 4: | > double mysin = 0.;
| 5: | >
| 6: | > for(i=0; i <= n; ++i)
| 7: | > mysin += vorzeichen((double) i ) * ( x = x*x*x )/(
| 8: | > fakultaet(2*i+1) );
| 9: | > return mysin;
| 10: | > } |
>
> Aber chrisno deutete an, dass damit etwas nicht stimmt...
> Nur was?
Das hatte ich dir doch geschrieben!?
> PS: Die Funktion "vorzeichen" gibt eigentlich eine
> Integer-Zahl aus. Habe ich das in Zeile 7 so richtig
> gemacht, dass sie eine double-Zahl ausgibt, wenn ich
> einfach so mache: vorzeichen((double) i ) ?
Nein.
Du castest dein "i" zu einem double.
Die Funktion "vorzeichen" bekommt aber ein "int".
Aus welchem Grund möchtest du denn, dass die Funktion vorzeichen ein "double" zurück liefert?
Die Funktion liefert doch entweder eine 1 oder eine -1.
Valerie
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 12:16 Do 16.05.2013 | Autor: | Marschal |
Sorry dann hab ich dich wohl nicht verstanden. Wie bekomme ich das hier:
> Für i=0 hast du $ x $.
> Für i=1 hast du $ [mm] x^3 [/mm] $.
> Für i=2 hast du $ [mm] x^5 [/mm] $.
im Quellcode umgesetzt?
> Die Funktion "vorzeichen" bekommt aber ein "int".
> Aus welchem Grund möchtest du denn, dass die Funktion > vorzeichen ein "double" zurück liefert?
> Die Funktion liefert doch entweder eine 1 oder eine -1.
In meinem Quellcode habe ich ja:
vorzeichen(i) * ( x = x*x*x )/( fakultaet(2*i+1) )
Da wird ja eine integer-Zahl mit dem Quotient zweier double-Zahlen multipliziert, sprich eine integer-Zahl mal eine double-Zahl. Aber geht das überhaupt? Wandelt es den integer-Faktor automatische in einen double-Faktor um?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:30 Do 16.05.2013 | Autor: | chrisno |
x
x*x*x
(x*x*x)*(x*x*x)*(x*x*x)
...?
Vielleicht sollte ich mich heraushalten, denn zum Beispiel kenne ich mich mit den Typecasts nicht aus. Du kannst immer mit einen kurzen Progämmchen ausprobieren, ob das Richtige passiert.
Wenn die Sprache keinen Operator für Potenzen hat, oder es Gründe gibt, den nicht zu benutzen, dann kannst Du Dir auch eine Funktion dafür schreiben.
Ich würde mir eher den folgenden Term aus dem vorangehenden holen. Dann brauchst Du auch die Fakultät nicht. Wahrscheinlich ist das kein guter Stil, ich bin eben mit Fortran aufgewachsen.
|
|
|
|
|
> Sorry dann hab ich dich wohl nicht verstanden. Wie bekomme
> ich das hier:
>
> > Für i=0 hast du [mm]x [/mm].
> > Für i=1 hast du [mm]x^3 [/mm].
> > Für
> i=2 hast du [mm]x^5 [/mm].
>
> im Quellcode umgesetzt?
>
Das kommt darauf an, was du alles verwenden darfst.
Nachdem du die Bib. math.h eingebunden hast, könntest du zum Beispiel mit der Funktion pow(Zahl,Exponent) arbeiten. Mehr dazu findest du bei Google.
> > Die Funktion "vorzeichen" bekommt aber ein "int".
> > Aus welchem Grund möchtest du denn, dass die Funktion >
> vorzeichen ein "double" zurück liefert?
> > Die Funktion liefert doch entweder eine 1 oder eine -1.
>
> In meinem Quellcode habe ich ja:
> vorzeichen(i) * ( x = x*x*x )/( fakultaet(2*i+1) )
>
> Da wird ja eine integer-Zahl mit dem Quotient zweier
> double-Zahlen multipliziert, sprich eine integer-Zahl mal
> eine double-Zahl. Aber geht das überhaupt? Wandelt es den
> integer-Faktor automatische in einen double-Faktor um?
Ja. Es wird immer vom kleineren zum größeren Wertebereich gecastet.
Wenn du zwei int´s teilst, bekommst du einen int zurück.
teilst du einen double durch ein int, so wird dein Ergenis Automatisch in double zurück gegeben.
Dein Typcast wäre trotzdem falsch.
Wenn hättest du schreiben müssen:
(double) vorzeichen(i).
Brauchst du hier aber nicht.
Es gibt in deinem Programm allerdings noch ein paar Fehler, die ich dir gleich sage:
1. msyn wird in der main falsch aufgerufen. Du musst x und n vertauschen.
2. Bei der Ausgabe der Zahlen sollte es sin(%lf) lauten anstatt sin(%d)
Valerie
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:44 Do 16.05.2013 | Autor: | Marschal |
Vielen vielen Dank euch beiden!
Ich habe das Programm jetzt verbessert. Allerdings funktioniert das Programm nur für kleine $ n $. So [mm] n\le [/mm] 100 würde ich schätzen. Ist das normal?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:18 Do 16.05.2013 | Autor: | chrisno |
klein ist eine Frage des Standpunkts. Schau Dir mal die Werte an, wie weit die noch dargestellt werden können. Ab wann steigt die Fakultät (int!) aus?
|
|
|
|
|
Hallo!
> vorzeichen(i) * ( x = x*x*x )/( fakultaet(2*i+1) )
Das x=x*x*x ist ziemlich pervers, funktioniert aber tatsäch in C. ich glaube nur, daß es nicht das macht, was du willst. im Prinzip ist das äquivalent zu
x=x*x*x;
vorzeichen(i) * x / ( fakultaet(2*i+1) );
Denk dran, für i=0 sollte hier sowas rauskommen wie
$1*x /1$
und für i=1
[mm] $-1*x^3 [/mm] /3!$
Dein Pogramm erzeugt aber das daraus:
i=0: $1*(x*x*x) /1$ also [mm] $1*x^3 [/mm] /1$
i=1: $1*(x*x*x)*(x*x*x)*(x*x*x) /3!$ also [mm] $1*x^9 [/mm] /3!$
(Das x hier ist das ursprüngliche x, das der Funktion mysin übergeben wurde)
Hinweis:
Unter den Mathefunktionen (#inlclude <math.h>) gibt es
pow(x, n) -> liefert dir [mm] x^n
[/mm]
Und für das Vorzeichen:
Versuche mal Modulo-Rechnung ("Teilen mit Rest"):
n % 2 -> liefert dir 0 oder 1 als Rest der Division durch 2, und damit die Info, ob das n grade oder ungrade ist.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:27 So 19.05.2013 | Autor: | Marschal |
Vielen Dank!
Hat alles geklappt!
|
|
|
|