Variablen müssen vor erstmaliger Verwendung oft initialisiert werden. Beispiel:
double sum;
[...]
sum = 0.0;
for (i=0; i<n; i++)
{
sum += folge[i];
}
Je nach Compiler wird eine frisch angelegte Variable oft automatisch auf 0 gesetzt.
Die (hier fettgedruckte) Initialisierung ist aber in diesem Praktikum verpflichtend (sonst Punkteabzug).
Wie setzt man mathematische Vektoren (und damit Matrizen) in C++-Felder um:
Wird über ein Feld hinaus gelesen oder geschrieben
double x[10];
[...]
x[10] = 0.9; // verbotener Schreibzugriff
[...]
cout << x[10]*x[10] - 2.0 << endl; // verbotener Lesezugriff
kann alles Mögliche an Fehlern auftreten (keine Garantie).
Wenn etwas nichts mit Potenzieren zu tun hat, ist die Verwendung von pow ineffizient. Auch fabs usw. nur verwenden wenn notwendig. Beispiele:
Falsch:
double x[N];
[...]
for (i=0; i<N; i++)
{
x[i] = pow (-1.0, i+1.0) / (i+1.0);
}
Richtig:
double x[N];
double help;
[...]
help = -1.0;
for (i=0; i<N; i++)
{
x[i] = help / (i+1.0);
help = -help;
}
x = pow (fabs(y), 2);
x = fabs(y)*fabs(y);
x = y*y; // Quadrate sind immer positiv!
Viele haben bei der Berechnung der Matrixnormen (Übung 3, Bsp. 2) Hilfsfelder für die Spaltensummen etc. verwendet. Es gibt aber einen Algorithmus der ohne diese auskommt (siehe Musterlösung) - in so einem Fall soll man also auch auf die Hilfsfelder verzichten.
Gleitkommazahlen (double, float, etc.) soll man nie auf (Un)gleichheit testen. Falls erforderlich nur mit relativen Kriterium. Beispiel:
double x;
[...]
if (x == 0) // richtig: if (fabs(x) < EPS)
{
[...]
Bei der 3. Übung, 1. Bsp, sollte der i-te Lagrange-Koeffizient berechnet werden. Hier ein logischer Fehler:
if (x[i] != x[j]) // richtig: if (i != j)