Eulersche zahl mit Hilfe Taylorreihe
-
aber bei deiner algemeinen variante kommt nur 1 raus..
-
pepe123 schrieb:
Ah super mit einer gen von 40 funktioniert der spaß dann
Das ist der falsche Ansatz.
Dafür gibt es kaum Punkte.
Es geht bei der Genauigkeit um die Nachkommastellen.
Nicht um irgendein fiktiven Wert.pepe123 schrieb:
aber bei deiner algemeinen variante kommt nur 1 raus..
Dann gib mal Werte kleiner als 1 für
gen
an.0.001
ist nicht schlecht.
-
brauch ich für
abs(a/c)
#include <math.h>
wenn ja brauch ich ne lösung nur mit <stdio.h>...
-
Das abs brauchst du hier nicht, da du ja nur positive Werte addierst.
e^x=1+x^1/1! + x^2/2! + ....... ^ ^ ^ da
Das a/c ist doch das x^k/k!
Und wenn dieser Teil sehr klein wird, brauchst du ihn auch nicht mehr addieren.Es gibt auch Taylorreihen wo das Vorzeichen wechselt und dann brauchst du den Betrag.
In C ist das abs nur für Integerwerte da. Für Fließkommezahlen gibt es fabs.
Und dafür bräuchtest du math.h.
-
pepe123 schrieb:
brauch ich für
abs(a/c)
#include <math.h>
Für fabs (abs ist aus stdlib.h, aber hier falsch): Ja.
wenn ja brauch ich ne lösung nur mit <stdio.h>...
Ich denke, du solltest wohl selber in der Lage sein, eine Funktion zu schreiben, die den Betrag einer Zahl zurückgeben kann.
Übrigens könntest du deine Vorfaktoren auch ein bisschen cleverer handhaben. Momentan werden a und c sehr schnell sehr groß, was ungünstig sein kann. Du benutzt aber in der Rechnung immer nur a/c. Da reicht es auch, nur a/c zu speichern und sich zu überlegen, wie sich a/c in jedem Durchlauf ändert.
edit: DirkB war wie immer schneller
-
include <math.h> is doch gestattet...
Danke für die Hilfe!!!!!#include <stdio.h> #include <math.h> double exppow(double x, double gen) { double a=1.; double c=1.; int d=1; double e=1.; while(gen<=fabs (a/c)) { a=a*x; c=c*d; e=e+ (a/c) ; d++; } return e; } int main (void) { int n=4; printf(" %g ", exppow(n,0.001) ); }
[code="c"]
-
pepe123 schrieb:
include <math.h> is doch gestattet...
Ist aber, wie schon gesagt, gar nicht nötig.
Um nochmal den Tipp von SeppJ bezüglich der Vorfaktoren aufzugreifen:
double exppow(double x, double gen) { int d=1; double e=1.; double de=1; // Hier fehlt noch die Überprüfung, ob die Paramter sinnvolle Werte enthalten do { de *= x/d ; // Hier wird nur noch mit dem Unterschied zum Vorwert gerechnet // Dadurch werden die Einzelwerte nicht so riesig groß e+=de; d++; } while(de>gen); return e; } int main (void) { printf(" %g ", exppow(1,1e-99) ); }
-
warum sind die differenzen nur positiv? input x kann doch auch negativ sein und dann sind es die differenzen auch.
-
Okay das is jetz mein entgültiger Quellcode:
#include <stdio.h> double exppow(double x, double gen) { double ep=1; double rg=1; int i=1; while(rg>gen) { rg=rg*x/i++; ep=ep+rg; } return ep; } int main (void) { printf(" %g ", exppow(3.0,0.001) ); }
-
Jetz hab ich von nem Kumpel den Quellcode für sinus(x) bekommen:
Allerdings versteh ich nicht was das %.3f im printf soll und iwie kommt da auch was falsches raus...
Vll könnt ihr mie da auch helfen ?!#include <stdio.h> #include <math.h> double sinpow(double x, double genauigkeit) { double sinus=x; double rg=x; int i=2; while( fabs(rg)>genauigkeit) { rg = rg * -x * x / i / ( i + 1 ); sinus = sinus + rg; i += 2; } return sinus ; } int main (void) { printf(" sin(x)=%.3f \n", sinpow(3.14,0.01) ); }
-
StarCraftFeuerteufel schrieb:
warum sind die differenzen nur positiv? input x kann doch auch negativ sein und dann sind es die differenzen auch.
schäm
-
pepe123 schrieb:
Allerdings versteh ich nicht was das %.3f im printf soll und
Gibt dir die Zahl mit 3 Nachkommastellen aus.
Siehe: http://www.cplusplus.com/reference/cstdio/printf/
-
Das programm müsste also jetz sin(3.14) berechenen.
mein taschenrechner wirft da 0,054 aus aber das programm 0,001...
-
pepe123 schrieb:
Das programm müsste also jetz sin(3.14) berechenen.
mein taschenrechner wirft da 0,054 aus aber das programm 0,001...Du kannst nicht mit deinem Taschenrechner umgehen. sin(3.14) = 0.00159265...
Allgemein ist es keine so gute Idee, Sinus, besonders mit so großen Zahlen wie 3.14, über die Taylorreihe zu berechnen, aber für die hier vorliegenden Anforderungen reicht es noch.
-
Dann stell mal deinen Taschenrechner auf Bogenmaß (RAD) um.
Der Sinus von Pi ist 0.
Wenn du mal ein paar mehr Stellen zu den 3.14 spendierst, solte das auch rauskommen.
-
-
Wie man aber auf den Therm kommt ist mir nich klar:
rg = rg * -x * x / i / ( i + 1 );
rg*-x*x ist für die potenz und den vorzeichenwechsel aber wie man auf die Fakultät kommt ist mir unklar...