Sqrt langage c

Fermé
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - Modifié par keurdange le 26/03/2011 à 01:57
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 - 27 mars 2011 à 19:09
Bonjour,

je suis débutant en programmation et j'aimerais un peu d'aide. Le programme suivant, me dit lors de la création du fichier exécutable (gcc -c trinome trinome.c), qu'il y a une erreur au niveau du sqrt. chose que je ne comprends pas.

#include<stdio.h>
#include<math.h>
float a,b,c,d,X,X1,X2,X,i;
main()
{
printf("Vous allez resoudre une équation du second dégré de la forme aX²+bX+c=0");
printf("Donner la valeur de a: ");
scanf("%f", &a);
printf("Donner la valeur de b: ");
scanf("%f", &b);
printf("Donner la valeur de c: ");
scanf("%f", &c);
printf("Votre équation à resoudre est %fX²+(%f)X+%f", a,b,c);
if(0==a)
printf("La solution de l'équation est %f", -c/b);
else if(0==b)
printf("Les solutions de l'équation sont %f et %f", -sqrt(c/a),sqrt(c/a));
else if(0==a&&0==b&&0==c)
printf("Il n'y a pas de solution sinon 0 ne peut être égale qu'à 0");
else
{
d=(b*b)-4*a*c;
if(0==d)
printf("La solution de l'équation est %f", -b/2*a);
else if(d<0)
printf("Les solutions de l'équation sont %f et %f", (-b+isqrtf(d))/(2*a),(b+isqrt(d))/(2*a));
else
if(d>0)
printf("Les solutions de l'équation sont %f et %f", (-b+sqrt(d))/2*a,(b+isqrt(d))/2*a);
}
}


i étant le nombre complexe imaginaire. Et on me dit ceci au moment de la création du fichier exécutable:

trinome.o: In function 'main':
trinome.c:(.text+0x11a): undefined reference to 'sqrt'
trinome.c:(.text+0x138): undefined reference to 'sqrt'
trinome.c:(.text+0x232): undefined reference to 'isqrt'
trinome.c:(.text+0x25e): undefined reference to 'isqrtf'
trinome.c:(.text+0x2ba): undefined reference to 'isqrt'
trinome.c:(.text+0x2f8): undefined reference to 'sqrt'
collect2: ld returned 1 exit status

Mon programme est nommé trinome.c, je suis sous ubuntu ultimate.

Quel est donc le probleme?



Dieu n'a fait qu'ébaucher l'homme, c'est sur terre que chacun se crèe

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 mars 2011 à 11:19
Bonjour,

isqrt n'existe pas en C standard. Dans le cas d'un discriminant négatif, tu dois calculer d'une part la partie réelle et d'autre part la partie complexe. Tu auras donc un nombre de la forme : x+i*y. A la place du isqrt, tu devras donc calculer sqrt(-d).
Pour sqrt(), c'est une fonction qui se trouve dans une bibliothèque externe, il faut donc linker avec -lm.
Pour la compilation, tu auras donc : gcc -lm -o trinome trinome.c (L minuscule).
Pas besoin de -c.
Cdlt,
0
Hxyp Messages postés 401 Date d'inscription vendredi 28 janvier 2011 Statut Membre Dernière intervention 27 avril 2014 54
26 mars 2011 à 18:15
Bonjour,
Il faut linker -lm avec gcc sous linux quand vous utilisez math.h
gcc trinome.c -c trinome -lm

*deuxième fois que je post ma réponse. il y a des problèmes avec l'édition sur le forum
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
26 mars 2011 à 19:18
gcc trinome.c -c trinome -lm
C'est plutôt -o que -c.
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
27 mars 2011 à 18:45
Ok. ca marche avec gcc trinome -o trinome -lm. Merci. Pouvez vous me dire les différentes manière de compiler (ou de créer un fichier exécutable) avec les différentes bibliothèques de C
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
Modifié par keurdange le 27/03/2011 à 19:13
Pour b=0 où d<0 (X²+3), on me dit que les reponses sont -nan et -nan. je ne comprends pas.
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
Modifié par keurdange le 26/03/2011 à 19:09
Ok. J'ai pas considérie le cas où delta (b²-4ac) est un nombre complexe (avec la partie réelle et la partie imaginaire non nulle du genre a+ib) mais juste dans le cas où il est négatif. Par exemple si d=(-25)=(25i²) donc les solutions sont (-b+ sqrt(25i²)/2a. cela implique (-b+ i5)/2a. d'pù l i sqrt. Ou comment dois je prcéder?
0
keurdange Messages postés 720 Date d'inscription lundi 8 novembre 2010 Statut Membre Dernière intervention 13 juillet 2016 231
26 mars 2011 à 19:30
Ok. Merci à vous tous. je vais essayer puis vous tenir évoluer de l'évolution de la situation.
0