E Fkt berechnen mit Anzahl der Summanden
-
andii schrieb:
d:\fh\info\mathe\mathe\mathe.cpp(36) : error C3861: 'exit': identifier not found
Für exit:
#include <stdlib.h>Das andere ist auch nur eine Kurzschreibform:
z*=x -> z = zx
i=j -> i = i*j
-
okay, more questions incoming, ich kuck mir das eben noch ein bisschen an
-
Wenn UINT einfach bei 0 weiterzählt sobald maximum erreicht ist, wieso krieg ich dann für +2 nur +1?
for ( n=1; n<g; n++, j++ )
sum += (z*=x)/(i*=j);das bedeutet also quasi:
n=n+1
sum(zähler) = z=z*x
sum(nenner) = i=i*(j=j+1)
was heißt das += ? sum = sum + ...?
achso, und diese schnell schreibweisen, in welcher h datei stecken die? ich muss das (irgendwann mal) zu papier bringen (ohne compile check) und wenn ich das nicht weiss ist eher schlecht
Warum funktionierts hiermit nicht:
for ( n=1; n<g; n++)
sum = sum + ((z=z*x)/(i=i*(j=j+1)));noch ein zusatz:
ich checke das hier nicht:double x; x = 123456.1234; printf("x=%8.3f",x);
und anzeigen tut er mir x= 123456.1234
wieso schneidet er nicht ab? x=123456.1 ?
dann hätte ich meine field width eingehalten, und die dezimal vorgabe gebrochen? wie macht der pc das hier genau? wo setzt er prioritäten?
wenn ich %7f mache, gibt er mir noch mehr an...?!
-
proggingmania schrieb:
Besser, 'kritische' Werte prüfen:
double i; // ... if (i > DBL_MAX ) { // ... } } }
*g* das wuerd ich mir nochmal ueberlegen
-
Hallo zusammen,
ich glaube, das Problem sind hier zwar die großen Zahlen und .
Aber es gibt einen Ansatz, der diese Zahlen nicht benötigt.Sei definiert als:
D.h. wir betrachten uns hier mal den Schritt vom i-ten Summanden
zum (i+1)-ten.
Es gilt ja folgendes:
und analog für die Fakulät:Also gilt für das Folgende:
[latex]z_{i+1} = \frac{x^{i+1}}{(i+1)!}[/latex] [latex]z_{i+1} = \frac{x^i \cdot x}{i! \cdot (i+1)}[/latex] [latex]z_{i+1} = \frac{x^i}{i!} \cdot \frac{x}{i+1}[/latex] [latex]z_{i+1} = z_i \cdot \frac{x}{i+1}[/latex]
Die Taylorentwicklung bis zum n-ten Glied von exp ist nun:
[latex]exp(x) = \sum_{i=0}^{n} z_i[/latex]
So, das war es von Seiten der Mathematik. Nun brauchst du nur noch
die Schritte zu implementieren. Das sollte nun nicht mehr so schwer sein.Gruß mcr
PS: ich habe diesen Thread nicht im Detail gelesen. Also bitte nicht auf den
Schlips getreten fühlen, sollte einer meiner Vorposter diesen Ansatz schon
einmal gepostet haben.
-
andii schrieb:
Wenn UINT einfach bei 0 weiterzählt sobald maximum erreicht ist,
wieso krieg ich dann für +2 nur +1?Bei UINT_MAX + 1 fängt er wieder von vorn an zu zählen, ist also gleich 0.
UINT_MAX + 2 == 1
UINT_MAX + 3 == 2
usw.andii schrieb:
Warum funktionierts hiermit nicht:
for ( n=1; n<g; n++)
sum = sum + ((z=z*x)/(i=i*(j=j+1)));Doch, das geht, wenn du vorher j=0.0 initialisierst. Sonst bist
du mit deiner Fakultät immer einen Schritt weiter und bekommst ein
zu kleines Ergebnis.andii schrieb:
achso, und diese schnell schreibweisen, in welcher h datei stecken die?
In keiner. Das ist im Compiler 'eingebaut', also ein Standard-Sprachmittel von C.
andii schrieb:
double x; x = 123456.1234; printf("x=%8.3f",x);
und anzeigen tut er mir x= 123456.1234
wieso schneidet er nicht ab? x=123456.1 ?Anzeigen sollte er 123456.123. Abgeschnitten wird auch nichts, die
Stellen werden nur 'versteckt'.
Ein printf("x=%8.1f", x); sollte dir 123456.1 anzeigen.Blue-Tiger schrieb:
proggingmania schrieb:
Besser, 'kritische' Werte prüfen:
double i; // ... if (i > DBL_MAX ) { // ... } } }
*g* das wuerd ich mir nochmal ueberlegen
Die Abfrage erfüllt in diesem Fall ihren Zweck.
Klappt leider nur, bei sehr großen Zahlen, wenn die Zahl i in den "1.#INF Modus" schaltet.Bei Abfragen wie z.B.
i = DBL_MAX+1; würde in der Abfrage if (i > DBL_MAX ) { //.. hier passiert nix }
nichts passieren, weil (i = DBL_MAX + 1) == DBL_MAX
ist.
Das hier bringt auch nix: num = DBL_MAX+1; printf("errno: %d\n", errno ); // 0 -> "OK" printf("finite: %d\n", _finite(num) ); // 1 -> "OK" printf("_isnan: %d\n", _isnan(num) ); // 0 -> "OK"
Ein double merkt erst ziemlich spät, das ihm die Luft ausgeht:
int main() { double num, add = 1E1; while(1) { num = 0.0; num = DBL_MAX + add; add *= 10; if( num > DBL_MAX ) { printf( "%G %G\n", num, add ); // Ausgabe: 1.#INF 1E+293 break; } } return 0; } // Ausgabe: 1.#INF 1E+293
Hilft wohl nur ein Compiler, der long double unterstützt, dann müsste
sowas hier eigentlich gehen:
if ( (long double)i > DBL_MAX )
mcr schrieb:
....
Aber es gibt einen Ansatz, der diese Zahlen nicht benötigt.
...
-
mcr schrieb:
[latex]exp(x) = \sum_{i=0}^{n} z_i[/latex]
das hilft mir ja nicht viel?
-
andii schrieb:
das hilft mir ja nicht viel?
Nicht wirklich. Denn schlussletztendlichstallerletztestens mußt du ja die Fakultät berechnen, nicht wahr doch.
Und ?
Läuft jetzt dein Proggie ?
-
ja es läuft danke
bin grad am nächsten problem, sinus als taylorreihe.
da habe ich dann summanden die nur alle ungeraden exponenenten haben, als ^3 ^5 usw... und auch + und - abwechselnd zwischen den summanden, was mir gerade die größten probleme bereitet aber ich tüfftel noch ein wenig bevor ich wieder schreie
-
andii schrieb:
mcr schrieb:
[latex]exp(x) = \sum_{i=0}^{n} z_i[/latex]
das hilft mir ja nicht viel?
Es tut mir Leid, dass du meinen Beitrag nicht komplett verstanden hast.
Du brauchst hierbei NICHT die Fakultät bestimmen!Der Knackpunkt liegt in dieser Zeile:
Ok, für die, die es immer noch nicht verstehen, mal ein wenig Pseudocode:
double summe = 0.; double summand = 1.; summe = summand; for i=0 to n do summand = summand * x / (i+1); summe = summe + summand; end return summe;
Nun bleib lediglich als Aufgabe übrig, diesen Pseudocode in C zu übersetzen.
Und wie ihr seht: hier wird weder die Potenz noch die Fakultät bestimmtGruß mcr
Ach übrigens, so ähnlich geht das dann auch mit dem sinus!
-
proggingmania schrieb:
Denn schlussletztendlichstallerletztestens mußt du ja die Fakultät berechnen, nicht wahr doch.
Wie zuvor geschrieben: deine Aussage ist falsch!
Gruß mcr
-
Ach Quatsch.
(i+1)! = i! * (i+1)
Toll und nu ? Ist i! etwa keine Fakultät ? Bekomme ich i! etwa durch, ich zitiere mal frei, "Vermeidung von großen Zahlen" ?
Ein x^1 kann ich auch nicht durch i! teilen, bevor ich i! habe.
So, und wenn ich bei i! nen 1.#INF00 wegen Werteüberschreitung kriege, kann ich mir auch die Berechnung von (i+1)! in die Haare schmieren.
Auch wenn i! ( sprich: i FAKULTÄT )vorher aus der Hutschachtel gezaubert kam.
-
proggingmania schrieb:
Ach Quatsch.
(i+1)! = i! * (i+1)
Toll und nu ? Ist i! etwa keine Fakultät ? Bekomme ich i! etwa durch, ich zitiere mal frei, "Vermeidung von großen Zahlen" ?
Ein x^1 kann ich auch nicht duchr i! teilen, bevor ich i! habe.
So, und wenn ich bei i! nen 1.#INF00 wegen Werteüberschreitung kriege, kann ich mir auch die Berechnung von (i+1)! in die Haare schmieren.
Auch wenn i! ( sprich: i FAKULTÄT )vorher aus der Hutschachtel genaubert kam.Hallo proggingmania,
ich habe da mal ein paar Fragen zu deiner Person:
-- Wie alt bist du?
-- Inwiefern hast du mit Programmieren und Mathematik zu tun?Ich kann dich leider nicht verstehen. Wenn du dir die Aufgabe ansiehst,
fällt dir auf, dass i! nicht benötigt wird. Schau dir mal meine Beiträge
an: Hier habe ich eine Möglichkeit aufgezeigt, wie man ohne die Berechnung
von i! auskommt. Ich habe sogar Pseudocode gepostet.Ich habe die exp(x) und sin(x) Berechnung implementiert und kam ohne
Probleme mit double aus.Bitte tu mir einen Gefallen und überleg dir, was du mir hier antwortest,
ich möchte nicht, dass das hier exskaliert.Aber ich muss dir Recht geben: i! und alleine zu berechnen
sprengt dir die normalen Datentypen. Aber hier wird der Quotient aus beiden
benötigt, dadurch bleiben die Zahlen im gebräuchlichen Wertebereich, wenn die
Reihenfolge clever gewählt ist.Gruß mcr
-
mcr schrieb:
Ich kann dich leider nicht verstehen. Wenn du dir die Aufgabe ansiehst,
fällt dir auf, dass i! nicht benötigt wird. Schau dir mal meine Beiträge
an: Hier habe ich eine Möglichkeit aufgezeigt, wie man ohne die Berechnung
von i! auskommt. Ich habe sogar Pseudocode gepostet.Hallo mcr,
Ich hatte die Definition von zi im Auge,mcr schrieb:
Sei definiert als:
D.h. wir betrachten uns hier mal den Schritt vom i-ten Summanden
zum (i+1)-ten.die auf der Berechnung von i! basiert.
Deinem Pseudocode habe ich leider zu wenig Beachtung geschenkt. Das habe ich heute nachgeholt, in der Tat läßt sich damit die direkte Berechnung der großen Zahlen vermeiden.
Sorry for any inconvenience.
Gruß,
p.
-
okay also ich schaffe es nicht alleine, ich komme nicht drauf wie das geht.
also der Sinus als Taylor:
x - (x^3 / 3!) + (x^5 / 5! ) - (x^7/7!) ...
wie man sieht wechseln die vorzeichen, da habe ich mir gedacht ich teile es auf in einen wert, wo alles abgezogen wird, und in einem wo alles addiert wird, und am ende verrechnen.
und mit dem 3! 5! 7!... komme ich überhaupt nicht klar, ich habs so probiert mit den ungeraden zahlen:
for(i=1;i<20;i=i+1) if (i/2 =! 0) {
aber das problem ist jetzt, das es dann mit den fakultäten ja nicht stimmt wenn ich sage n=n*i, dann hätte ich ja 1*1, 1*3, 1*3*5 usw..
HILFE
-
-
andii schrieb:
okay also ich schaffe es nicht alleine, ich komme nicht drauf wie das geht.
hast du den pseudocode von mcr nach C übersetzt? der sollte doch eigentlich funzen.
-
Wie willst du denn die Fakultät berechnen. Direkt, oder mit dieser Vermeidung von großen Zahlen Geschichte ?
Der Typ double macht ja erst bei (171)! den Klappmann, brauchbare Werte bekommt man bei der Sinusreihe schon bei ca. (13)!
-
pseudo-freak schrieb:
andii schrieb:
okay also ich schaffe es nicht alleine, ich komme nicht drauf wie das geht.
hast du den pseudocode von mcr nach C übersetzt? der sollte doch eigentlich funzen.
Hi, der angegebene Pseudocode ist nicht für die Sinus-Taylor-Entwicklung,
sondern für die E-Funktion gedacht. Aber es sollte nicht allzu schwer sein,
diesen Code umzuschreiben.Gruß mcr
-
Ok, bevor noch Fragen kommen:
Hier mal Pseudocode für die Sinus-Taylor-Entwicklung:
sin(x): double summe = x; double summand = x; for i=1 .. n do summand = summand * (x*x / ((2*i+1)*(2*i))); if (i%2 == 0) summe = summe + summand; else summe = summe - summand; end
So, ich glaube, nun habe ich zu viel geholfen.
Viel Spaß beim Implementieren.Gruß mcr