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 😉


Anmelden zum Antworten