Eine weitere C-Aufgabe war die Berechnung respektive Annäherung der Eulerschen Zahl - diese enthält eine unendliche nichtperiodische Dezimalbruchentwicklung. Die Formel zur Berechnung sieht folgendermaßen aus:
(1+1/n)^n
Vorgegeben war in der Aufgabenstellung, das n eine Variable vom Typ Integer ist und die Potenzierung in einer separaten Schleife durchgeführt werden muss. Diesen Code hatte ich letztendlich verwendet:
double x;
int y;
x=(1+1/n);
for (y=1;y<=n;y+=1)
{
x=x*x;
}
Das ganze natürlich gekapselt in einer eigenen Funktion mit n als int-Parameter. Zwei Fehler hatte ich dabei gemacht:
1. In der Form findet bei der erstmaligen Berechnung von x eine Ganzzahldivision statt - das ist an der Stelle nicht erwünscht, es muss mit den Kommaanteilen weitergerechnet werden. Bei n=4 hätte er so 0,25 errechnet und lediglich 0 davon behalten. Richtig wäre gewesen:
x=(1+1.0/n);
Bei einer Division muss eine der zwei Zahlen eine Fließkommazahl sein, soll der Kommaanteil des Ergebnisses beibehalten werden. Alternativ kann auch n nach double gecastet werden.
Laut der Aussage des Dozenten hatten von 17 Leuten nur zwei diesen Fehler NICHT gemacht. Seltsamerweise hat aber bei der Frage zuvor, wer diesen Fehler gemacht habe, nur ich aufgezeigt.
2. Die Potenzierung ist falsch - sie sah zwar auf dem Papier richtig aus, aber als Ergebnis hätte er dann beispielsweise (ohne Bezug auf die Aufgabenstellung) 5*5 im ersten Schleifendurchlauf, 25*25 im zweiten Schleifendurchlauf usw. gerechnet (nur um den Fehler zu verdeutlichen).
Die richtige Variante wäre so ausgefallen:
for (y=1;y<=n;y+=1)
{
x=x*(1+1.0/n);
}
Einer der zwei Werte in der Multiplikation hätte also im Wert konstant bleiben müssen.
Ergänzung 9.4.2011: n bedeutet hier lediglich, die wievielte Annäherung berechnet werden soll. Die Eulersche Zahl ist unendlich, wie gesagt.
Ein gutes Beispiel dafür, wieviele Fehler man bereits bei so einer kleinen Aufgabe einbauen kann. Aber schriftlich zu programmieren ist schon etwas anderes als über den PC.
Weitere Links: