2010-11-08 28 views
6
#include <math.h> 
#include <stdio.h> 

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 toma 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.Programación C Función sqrt

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

SALIDA:

[email protected]:~/Programming/C.progs/Personal$ vim sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ cc -c sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ cc -o sqroot1 sqroot1.c 
[email protected]:~/Programming/C.progs/Personal$ ./sqroot1 
4.472136 
[email protected]:~/Programming/C.progs/Personal$ vim sqroot2.c 
[email protected]:~/Programming/C.progs/Personal$ cc -c sqroot2.c 
[email protected]:~/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 
[email protected]:~/Programming/C.progs/Personal$ 

NOTA: sqroot1 es la Sqroot de 20,0. sqroot2 es la raíz cuadrada de una variable.

[email protected]:~/Programming/C.progs/Personal$ cc -o sqroot2 sqroot2.c -lm 
[email protected]:~/Programming/C.progs/Personal$ ./sqroot2 
4.472136 
[email protected]:~/Programming/C.progs/Personal$ 

SOLVED.

+2

Mensaje how no funciona, ya que funcionaría ... –

+0

Ese código se ve bien para mí. ¿Qué resultado obtendrás cuando lo ejecutes? –

+0

Dices que no funciona: ¿qué ves? Debería funcionar, aunque como una cuestión de estilo pondría la variable de resultado en una línea diferente. También te falta una/antes de la n final en tu printf. – winwaed

Respuesta

35

El código debería funcionar bien si está enlazando en las bibliotecas adecuadas (libc.a y libm.a). Su problema probablemente sea que está utilizando gcc y se está olvidando de vincularlo en libm.a a través del -lm, que le da una referencia indefinida a sqrt. GCC calcula el sqrt(20.0) en tiempo de compilación porque es una constante.

intenta compilar 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 

A continuación, echar un vistazo a la asamblea en myfile.s y usted no verá la línea call sqrt en cualquier lugar.

+11

Esa es una lectura de mente bastante impresionante. –

+4

Si cometió el mismo error y llegó a la misma conclusión en su curso introductorio de programación, estoy seguro de que también será la señorita Cleo. – Kizaru

+0

No puedo encontrar la opción -lm en la página de manual de gcc. – qed

Cuestiones relacionadas