Logarithmus < Softwaretechnik+Pro < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Aufgabe | Aufgabe 2
Für alle reellen Zahlen x mit x > 1/2 kann der natürliche Logarithmus anhand der folgenden unendlichen Reihe berechnet werden:
[mm] $\ln(x) [/mm] = ( x − 1 / x ) + ( ( x − 1 [mm] )^2 [/mm] / [mm] 2x^2 [/mm] ) + ( ( x − 1 [mm] )^3/ 3x^3 [/mm] ) + ... [mm] \summe_{k=1}^{inf} [/mm] (x - 1) ^k / k * x ^k$
Schreiben Sie ein C-Programm, welches
• zunächst ein Logarithmus-Argument x kommentiert einliest (alle Gleitpunkt-Datentypen sollen vom Typ
double sein),
• überprüft, ob das Argument verbotenerweise kleiner oder gleich 1/2 ist, und dann ggf. einen kommentier-
ten Programmabbruch durchführt,
• danach die angegebene Reihe auswertet (Abbruch der Schleife, wenn sich die neue Teilsumme nicht
mehr von der alten unterscheidet),
• und danach das Ergebnis in der folgenden Form ausgibt (die Zahlenwerte sind nur ein Beispiel):
Reihe: ln(3.500000) = 1.252762968. Es sind also 9 Nachkommastellen zu verwenden.
• Zum Vergleich soll auch der Wert der Funktion des natürlichen Logarithmus der math. Bibliothek in ana-
loger Formatierung ausgegeben werden : Bibl.: ln(3.500000) = 1.252762968.
Achtung: Bei der Summierung darf nicht die Funktion pow() benutzt werden. Die Summanden sollen rekur-
siv anhand der jeweiligen Vorgänger-Summanden berechnet werden. Natürlich muss rechtzeitig ein geeig-
neter Anfangswert bereit stehen. |
Mein Code:
1: |
| 2: | #include <stdio.h>
| 3: |
| 4: | int main(void)
| 5: | {
| 6: |
| 7: | int i, exp;
| 8: | double x, y, z, v, n, erg1, erg2;
| 9: |
| 10: | printf("\n Logarithmus-Argument eingeben: ");
| 11: | scanf("%lf", &x);
| 12: |
| 13: | erg2 = (x-1) / x;
| 14: | erg1 = 0;
| 15: | exp = 1;
| 16: |
| 17: | while (erg2 - erg1 > 0.5)
| 18: | {
| 19: | erg1 = erg2;
| 20: | y = 1;
| 21: |
| 22: | for (i = 1; i < exp+1; ++i)
| 23: | y = y * (x-1);
| 24: |
| 25: | z = y;
| 26: | y = 1;
| 27: |
| 28: | for (i = 1; i < exp+1; ++i)
| 29: | y = y * x;
| 30: |
| 31: | v = exp * y;
| 32: |
| 33: | erg2 = erg2 + (z/v);
| 34: | printf(" z / v = %lf / %lf\n", z, v);
| 35: | printf("exp = %d\n", exp);
| 36: | ++exp;
| 37: | }
| 38: |
| 39: | printf("Logarithmus von %lf ist: %lf\n\n", x, erg2);
| 40: |
| 41: | return 0;
| 42: | }
| 43: |
|
Es stimmt nur leider noch nicht ganz. Er addiert zum Endergebnis immer noch (x-1)/x hinzu. Immerhin weiß ich das. Aber die Fehlerquelle selbst finde ich leider nicht....
Würde mich über Hilfe sehr freuen!
Viele Grüße
Pingumane
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:20 Mo 07.07.2014 | Autor: | Pingumane |
Ich habe meine Frage glaube ich im falschen Thread gepostet. Könnte sie eventuell zu "Programmieren" verschoben werden?
|
|
|
|
|
Hallo,
hab's entsprechend verschoben ...
Gruß
schachuzipus
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 08:20 Di 08.07.2014 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|