Programmation C Fonction sqrt

#include  #include  int main(void) { double x = 4.0, result; result = sqrt(x); printf("The square root of %lf is %lfn", x, result); return 0; } 

Ce code ne fonctionne pas car il prend la racine carrée d’une variable. Si vous modifiez le sqrt(x) , en sqrt(20.0) , le code fonctionne parfaitement, pourquoi? S’il vous plaît, expliquez.

Aussi, comment puis-je obtenir la racine carrée de la variable (qui est ce dont j’ai vraiment besoin)?

SORTIE:

 matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot1.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot1.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot1 sqroot1.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot1 4.472136 matthewmpp@annrogers:~/Programming/C.progs/Personal$ vim sqroot2.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -c sqroot2.c matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c /tmp/ccw2dVdc.o: In function `main': sqroot2.c:(.text+0x29): undefined reference to `sqrt' collect2: ld returned 1 exit status matthewmpp@annrogers:~/Programming/C.progs/Personal$ 

Remarque: sqroot1 est le sqroot de 20.0. sqroot2 est la sqroot d’une variable.

 matthewmpp@annrogers:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c -lm matthewmpp@annrogers:~/Programming/C.progs/Personal$ ./sqroot2 4.472136 matthewmpp@annrogers:~/Programming/C.progs/Personal$ 

Résolu

Le code devrait fonctionner correctement si vous liez dans les bibliothèques appropriées (libc.a et libm.a). Votre problème est probablement que vous utilisez gcc et que vous oubliez de créer un lien dans libm.a via -lm , ce qui vous donne une référence non définie à sqrt. GCC calcule le sqrt(20.0) au moment de la compilation car c’est une constante.

Essayez de le comstackr avec

 gcc myfile.c -lm 

EDIT: Quelques informations supplémentaires. Vous pouvez le confirmer en consultant l’assemblage généré lorsque vous remplacez x par une constante dans l’appel sqrt .

 gcc myfile.c -S 

Ensuite, jetez un coup d’œil à l’assembly dans myfile.s et vous ne verrez nulle part l’ call sqrt la ligne.

Vous devriez le faire comme ça:

 root@bt:~/Desktop# gcc -lm sqrt.c -o sqrt root@bt:~/Desktop# ./sqrt The square root of 4.000000 is 2.000000n root@bt:~/Desktop#