Anfänger: C kann kein sqrt
-
Servus,
bin gerade dabei C anhand einiger simplen Beispiele zu lernen. Ich verwende Eclipse 3.4.2 auf Ubuntu 9.04.
Ich hab versucht ein vorgegebenes Struktogramm auszuprogrammieren, doch der Linker meckert beim Übersetzen.
/* ============================================================================ Name : kubische_gleichung.c Author : Andreas Description : berechnet eine kubische Gleichung ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { const double eps = 1.0E-8; //Approximationsgenauigkeit double a2, a1, a0; double x,y; double x1, y1, x2, y2; double p,q,d; printf ("Normalform: x³ + a2*x² +a1*x +a0 = 0\n"); printf ("a2 = "); scanf ("%lf", &a2); printf ("a1 = "); scanf ("%lf", &a1); printf ("a0 = "); scanf ("%lf", &a0); x2 = 0.0; y2 = a0; while (y1*y2 <=0.0) { x1 = x2; y1 = y2; if (y1<0) { x2=x1+0.1; } else { x2=x1-0.1; } y2=((x2+a2)*x2+a1)*x2+a0; } while (fabs(x2-x1)<eps) { x=x1-y1*(x2-x1) / (y2-y1); y=((x+a2)*x+a1)*x+a0; if (y*y1>=0.0) { x1=x; y1=y; } if (y*y2>=0.0) { x2=x; y2=y; } } printf ("x1 = %f\n",x1); p= a2+x1; q= x1*x1 + a2*x1 +a1; d= p*p/4 -q; if (d<0.0) { printf ("x2 = %0.3lf +j %0.3lf\n",-p/2, sqrt(-d)); printf ("x3 = %0.3lf -j %0.3lf\n",-p/2, sqrt(-d)); } else { printf ("x2 = %0.3lf\n",-p/2 + sqrt(d)); printf ("x3 = %0.3lf\n",-p/2 - sqrt(d)); } return 0; }
/home/voellenk/workspace/kubische_gleichung/Debug/../src/kubische_gleichung.c:56: undefined reference to `sqrt' /home/voellenk/workspace/kubische_gleichung/Debug/../src/kubische_gleichung.c:57: undefined reference to `sqrt' /home/voellenk/workspace/kubische_gleichung/Debug/../src/kubische_gleichung.c:59: undefined reference to `sqrt' /home/voellenk/workspace/kubische_gleichung/Debug/../src/kubische_gleichung.c:60: undefined reference to `sqrt'
Was passt ihm da nicht an der Wurzelfunktion in den letzten Zeilen?
Eine andere Frage: Gibt es einen Unterschied zwischen
double x2;
x2 = 0.0;
oder
x2 = 0;
-
Gibt es einen Unterschied zwischen
double x2;
x2 = 0.0;
oder
x2 = 0;Basis, Mantisse und Exponent werden in deinen Beispielen intern gleich dargestellt.
Also Nein.
-
sqrt hat 2 Parameter und nicht 1.
-
Mentras schrieb:
sqrt hat 2 Parameter und nicht 1.
Blödsinn. Ich denke eher, hier fehlte die Lib.
-
Die ist doch eingebunden...
€dit:
Hab da wohl was verwechselt, dachte es wäre pow(x,y)^^
-
Hab grad eine sin- Funktion getestet- funktioniert auch nicht (undefined reference to sin)
-
Parameter für gcc: -lm
-
Danke für den Hinweis, habs händisch zu kompilieren versucht und es hat geklappt. Nach weiterem Forschen hab ich herausgefunden wie man das im Eclipse einträgt:
you should add the -lm option to GCC C Linker, NOT TO GCC C Compiler. To do that, you should go to:
Project -> Properties -> C/C++ Build -> Settings -> Tool Settings (tab) -> GCC C Linker
and in the "Command" text field type: "gcc -lm" (by default there is only "gcc").
Wenn's bei solchen Kleinigkeiten schon hakt muss ich mich auf einen sehr steinigen Weg gefasst machen
-
Für den Anfang würde ich ohnehin überlegen einfach einen gescheiten Editor zu nehmen und den Compiler grundsätzlich händisch aufzurufen. Edit: denn der C-Weg wird schon steinig genug