Neuling mit einer Frage :)
-
hallo zusammen, ich studiere im ersten semester informatik und wir haben nun mit dem programmieren in ANSI-C begonnen.
meine kenntnisse sind entsprechend amateur-haftfolgendes problem habe ich:
ich soll ein programm schreiben,wo der nutzer einen x-wert eingeben kann und anschliessend verschiedene berechnungen mit x durchgeführt werden und ausgegeben werden.
mein quellcode sieht derzeit so aus:#include <stdio.h>
#include <math.h>int main()
{
//Deklarierung der Variablen als Fliesskommazahl:
float x,abbet,ln,lg,wurz,ehoch,xhoch3,xhoch5,wurz3,sns,csn,tng,atng;
printf("Mathematische Funktionen\n ========================\n");
printf("x-Wert: ");
scanf("%lf",&x);
getchar();//Berechnung der einzelnen Werte:
abbet = fabs(x) ; ln = log(x); lg=log10(x);
wurz=sqrt(x); ehoch=exp(x); xhoch3=pow(x,3);
xhoch5=pow(x,5); wurz3=pow(x,(1/3));
sns=sin(x); csn=cos(x); tng=tan(x); atng=atan(x);//Nun Ausgabe der berechneten Werte per prinf:
printf("absoluter Betrag: %10.21f Ohm\n", abbet);
.....hier folgen dann die ganzen ausgaben der errechneten werte per printfich kann bei meinem code absolut keinen fehler entdecken, dennoch kommt beim compilieren folgende fehlermeldung:
lalas@linux-is57:~/ubg/aufg03a> gcc ubg03a.c -o ubg03a.x
/tmp/cc2oVQWU.o: In functionmain': ubg03a.c:(.text+0x50): undefined reference to
log'
ubg03a.c:(.text+0x5e): undefined reference tolog10' ubg03a.c:(.text+0x86): undefined reference to
sqrt'
ubg03a.c:(.text+0x9a): undefined reference toexp' ubg03a.c:(.text+0xb2): undefined reference to
pow'
ubg03a.c:(.text+0xca): undefined reference topow' ubg03a.c:(.text+0xe0): undefined reference to
sin'
ubg03a.c:(.text+0xee): undefined reference tocos' ubg03a.c:(.text+0xfc): undefined reference to
tan'
ubg03a.c:(.text+0x10a): undefined reference to `atan'
collect2: ld returned 1 exit statusalso anscheinend kann mein programm mit den einzelnen rechenfunktionen nichts anfangen, obwohl ich den math.h-header eingebunden habe.
ich arbeite unter openSUSE 10.3, benutze kate als editor und kompiliere mit gcc.
google hat mir gesagt, dass es sich wohl um einen linker-fehler handelt, nur leider weiss ich nun absolut nicht wo ich ansetzen soll.würde mich freuen wenn mir jemand helfen könnte. vielen dank!
gruss,
lalas
-
das ist ein linker-fehler.
du hast zwar die header eingebunden, nur weiß quasi niemand so genau, wo jetzt die rümpfe der funktionen stehen, welche du verwenden willst, die deklarationen gibt es zwar, jedoch findet der linker keine weiteren infosbeim compilieren (ich gehe bei suse jetzt mal davon aus, dass du den gcc verwendest), musst du noch -lmath als option angeben, um die mathe-bib zu verlinken
-
danke für die schnelle antwort.
nun kommt folgende meldung:
/usr/lib/gcc/i586-suse-linux/4.2.1/../../../../i586-suse-linux/bin/ld: cannot find -lmath
collect2: ld returned 1 exit statusnen tipp wo ich diese lmath-datei finden kann ?
-
sorry, mein fehler, anstatt lmath -lm
-
In Zukunft bitte aussagekräftige Topics und [cpp]-Tags.
-
Tim schrieb:
In Zukunft bitte aussagekräftige Topics und [cpp]-Tags.
immer die gleiche leier
-
Ist ja auch immer das gleiche Problem
-
tut mir leid für den nicht-aussagekräftigen titel
also mein programm läuft soweit, bräuchte nur mal nen tipp, wie ich die anzahl der nachkomma-stellen beeinflussen kann, habe zwar die doku von printf angeguckt, aber verstehe nur bahnhof.
beispiel:
ich habe die zahl x=7.348 als float eingegeben und mit fabs(x) wird der absolute betrag berechnet.
hier mal mein code ausschnittsweise:float x,abbet,ln,lg; printf("Mathematische Funktionen\n ========================\n"); printf("x-Wert: "); scanf("%f",&x); getchar(); abbet = fabs(x); printf("absoluter Betrag: %f \n", abbet); getchar(); return 0;
bekomme ich das korrekte ergebnis, allerdings spuckt er mit den wert 7.348000 aus. ebenso bei anderen rechenoperationen.
ich weiss das der typ float nun 6 stellen einnimmt. einen anderen variablen-typ kann ich nicht nehmen, da ich insgesamt 12 ausgaben machen muss, mit jeweils verschiedene anzahl stellen.
ich denke also ich würde das am besten mit formatierungsoptionen in printf hinbekommen, nur wie ??danke nochmals
-
Schau mal hierhttp://www.cplusplus.com/reference/clibrary/cstdio/printf.html
Der Formatierungsparameter, den Du suchst, heißt 'precision' in o.g. Link.
Somit wäreprintf("absoluter Betrag: %8.3f \n", abbet);
möglicherweise eine Lösung.
Damit sollten 8 Stellen insgesamt mit immer 3 Nachkommastellen ausgegeben werden.
-
PERFEKT VIELEN DANK !!
genau sowas hat mir gefehlt
und dann vielleicht die letzte frage, eher mathematisch:
wie kann ich die dritte wurzel aus x ziehen. habe es versucht mit:
wurz3=pow(x,(1/3));
und
wurz3=pow(x,(1/3);
wenn ich
wurz3=pow(x,0.33);
mache, habe ich das näherungsweise korrekte ergebnis, bedeutet er schluckt mein 1/3 (1 drittel) nicht in der formel.
aber leider liefert es falsche ergebnisse. jemand ne idee ?
-
1/3 "schluckt" der Compiler schon - er berechnet den Wert allerdings mit Ganzzahl-Arithmetik (ohne Nachkomma-Stellen). Versuch's mal mit 1.0/3.0 *
* Es reicht auch aus, wenn einer der Werte eine Gleitkomma-Zahl ist
-
hervorragend, das hat mir schon geholfen...vielen vielen dank!!
hier mal für alle die es interessiert mein quelltext:
#include <stdio.h> #include <math.h> int main() { //Deklarierung der Variablen als Fliesskommazahl: float x,abbet,ln,lg; float wurz,ehoch,xhoch3,xhoch5,wurz3,sns,csn,tng,atng; printf("Mathematische Funktionen\n========================\n"); printf("\nx-Wert: "); scanf("%f",&x); getchar(); //Berechnung der einzelnen Werte: abbet = fabs(x); ln = log(x); lg=log10(x); wurz=sqrt(x); ehoch=exp(x); xhoch3=pow(x,3); xhoch5=pow(x,5); wurz3=pow(x,1.0/3.0); sns=sin(x); csn=cos(x); tng=tan(x); atng=atan(x); //Nun Ausgabe der berechneten Werte per printf: printf("\nabsoluter Betrag: %4.3f \n", abbet); printf("natürlicher Logarithmus: %6.5f \n", ln); printf("Logarithmus zur Basis 10: %7.6f \n", lg); printf("Quadratwurzel: %6.5f \n", wurz); printf("e hoch x: %6.2f \n", ehoch); printf("x hoch 3: %6.3f \n", xhoch3); printf("x hoch 5: %6.1f \n", xhoch5); printf("3. Wurzel aus x: %6.5f \n", wurz3); printf("\ntrigonometrische Funktionen arbeiten mit Bogenmass!!!\n"); printf("-----------------------------------------------------\n"); printf("Sinus: %f \n", sns); printf("Kosinus: %f \n", csn); printf("Tangens: %6.5f \n", tng); printf("Arcus Tangens: %6.5f \n", atng); getchar(); return 0; }
vielleicht hat ja jemand verbesserungsvorschläge oder anmerkungen, nochmals VIELEN dank an alle!
gruss,
lalas
-
CStoll schrieb:
Versuch's mal mit 1.0/3.0 *
* Es reicht auch aus, wenn einer der Werte eine Gleitkomma-Zahl ist
Ich dachte der erste ist wichtig, nicht dass es nur einer ist.
-
nö, irgendeiner, es wird sich immer nach dem genauesten datentypen in der berechnung gerichtet...
langt auch1/3.;
also in der theorie
-
echt? schrieb:
CStoll schrieb:
Versuch's mal mit 1.0/3.0 *
* Es reicht auch aus, wenn einer der Werte eine Gleitkomma-Zahl ist
Ich dachte der erste ist wichtig, nicht dass es nur einer ist.
Es ist egal, welcher. Bei einer Operation werden zunächst beide Operanden auf den höherwertigen Datentyp gebracht und dann verrechnet (das heißt, bei "1/3.0" wird die 1 nach double umgewandelt und anschließend folgt eine Gleitkomma-Division).
-
Nice site!