Progtwigndo la función 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; } 

Este código no funciona porque está tomando la raíz cuadrada de una variable. Si cambia el sqrt(x) , a sqrt(20.0) , el código funciona bien, ¿por qué? Por favor explique.

Además, ¿cómo obtengo la raíz cuadrada de la variable (que es lo que realmente necesito)?

SALIDA:

 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$ 

NOTA: sqroot1 es el sqroot de 20.0. sqroot2 es el sqroot de una 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$ 

Resuelto

El código debería funcionar bien si está enlazando en las bibliotecas adecuadas (libc.a y libm.a). Probablemente, su problema es que está usando gcc y se le olvida vincular en libm.a a través de -lm , lo que le -lm una referencia indefinida a sqrt. GCC calcula el sqrt(20.0) en tiempo de comstackción porque es una constante.

Intenta comstackrlo con

 gcc myfile.c -lm 

EDIT: un poco más de información. Puede confirmar esto mirando el ensamblaje generado cuando reemplaza x con una constante en la llamada sqrt .

 gcc myfile.c -S 

Luego, observe el ensamblaje en myfile.s y no verá la línea call sqrt ninguna parte.

Deberías hacerlo así:

 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#