Ich machte ein Programm, das die jeweilige Taylor-Serie berechnet, aber der Professor will, dass wir es ändern, indem wir zuerst teilen und dann multiplizieren. Dies ist mein Code und ich verwende die divide() für den ersten Teil. Meine power() und fact() sind nur Verweise auf meinen alten Code.Taylor-Serie in C mit Funktionen durch zuerst teilen und dann multiplizieren
#include <stdio.h>
#include <math.h>
int main()
{
double x, mySin(), myCos(), myExp();
char more;
do {
printf ("\n\t\t\t\t\tInput x: ");
scanf ("%lf", &x);
printf ("\n\t\t\t\t\t\t\tLibraryResult \t MyResult");
printf ("\n\t\t\tSin(%6.2f)\t %9.6f\t\t%9.6f", x, sin(x), mySin(x));
printf ("\n\t\t\tCos(%6.2f)\t %9.6f\t\t%9.6f", x, cos(x), myCos(x));
printf ("\n\t\t\tExp(%6.2f)\t %9.6f\t\t%9.6f", x, exp(x), myExp(x));
printf ("\n\n\t\t\t\t\tDo more (Y/N) ?");
scanf ("%s", &more);
} while (more == 'y' || more == 'Y');
}
double mySin(double x)
{
double sum = 0., divide();
int i, sign = 1;
for (i = 0; i < 30; i++, sign = - sign)
sum = sum + sign * divide(x) ; //power(x, 2 * i + 1)/fact(2 * i + 1);
return sum;
}
double myCos(double x)
{
double sum = 0., divide();
int i, sign = 1;
for (i = 0; i < 30; i++, sign = - sign)
sum = sum + sign * divide(x);//power(x, 2 * i)/fact(2 * i);
return sum;
}
double myExp(double x)
{
double sum = 0., divide();
int i;
for (i= 0; i < 30; i++)
sum = sum + divide(x); //power(x, i)/fact(i);
return sum;
}
double divide(int n, double x)
{
int i;
double div = 1.;
for (i = 1; i < n; i++)
div = x/i;
return div;
}
/*double fact(int n)
{
int i;
double prod = 1.;
for (i = 1; i <= n; i++)
prod = prod * i;
return prod;
}
double power (double x, int n)
{
int i;
double prod = 1.;
for (i = 0; i < n; i++)
prod = prod * x;
return prod;
}
*/
Ich habe mit dem Code und, wenn in dem Divide() Herumspiele, i < n ergibt kein Ergebnis zu verwenden, wenn I x einzugeben. Allerdings funktioniert die Verwendung von i < 30, aber die Berechnungen sind falsch. Ich versuche das herauszufinden, also wäre nur ein Zeiger hilfreich! Vielen Dank!
In der Divide-Funktion macht die 'for'-Schleife nichts, weil Sie einfach den Wert von' div' jedes Mal überschreiben. Also, so wie es ist, ist die Funktion äquivalent zu 'return x/(n-1);'. Vielleicht meintest du 'div * = x/i;'. – user3386109
Beachten Sie auch, dass Ihre 'divide' zwei Argumente benötigt:' dividiere (int n, double x) ', aber du nennst es mit nur einer,' sum = sum + sign * divide (x) '. Dies sollte Ihnen einen Fehler geben, aber Sie haben eine 'lokale' Division als 'doppelte Summe = 0, dividieren();' erklärt, mit der der Compiler nur einverstanden ist, aber dann geben Sie nur x an, damit es keine Ahnung hat, was zu tun ist mach mit n. Übergeben Sie das Extra 'n' und es sollte mehr Sinn ergeben. – LambdaBeta
Allgemeiner Tipp, um das Problem zu vermeiden, auf das LambdaBeta hingewiesen hat: Stellen Sie niemals Funktionsprototypen in andere Funktionen und niemals unter Angabe eines Funktionsprototyps. Es gibt zwei Standardverfahren. 1) Setzen Sie alle Funktionsprototypen an den Anfang der Datei. Kopieren Sie die Funktionsdefinition, fügen Sie sie am Anfang der Datei ein und fügen Sie ein Semikolon hinzu. 2) Ordnen Sie die Funktionen in umgekehrter Reihenfolge an. Das heißt, divide steht zuerst in der Datei, gefolgt von myCos, mySin, myExp und main am Ende der Datei. Auf diese Weise fungieren die Funktionsdefinitionen als Funktionsprototypen und vermeiden Fehler in den Prototypen. – user3386109