Discussion:
Función sqrt bajo Linux (gcc)
(demasiado antiguo para responder)
Víctor Biot Domingo
2003-11-16 15:48:52 UTC
Permalink
Muy buenas.

Estoy empezando con esto del C, además de con Linux. Hasta el momento todo
lo que compilaba en Linux me iba bien, pero al introducir "sqrt" me da unos
errores. En Windows lo he compilado con un Turbo C y se ejecuta
correctamente. ¿Dónde me equivoco?

#include<stdio.h> //necesaria para printf
#include<math.h> //necesaria para sqrt (raíz cuadrada)

main()
{
int i=9;
double r=0; //iniciación de la variable r

r=sqrt((double)i/2);
printf("La raíz cuadrada es: %g\n", r);
}

Muchas gracias.

Víctor

PS. ¿Se puede escribir en texto enriquecido (HTML) en estas news o es
obligao escribir en texto sin formato?
Fernando Arbeiza
2003-11-16 16:27:58 UTC
Permalink
On Sun, 16 Nov 2003 16:48:52 +0100, Víctor Biot Domingo
Post by Víctor Biot Domingo
Muy buenas.
Estoy empezando con esto del C, además de con Linux.
En mi caso, no me he arrepentido con ninguno de los dos. Espero que te
pase lo mismo ;-)
Post by Víctor Biot Domingo
Hasta el momento todo lo que compilaba en Linux me iba bien, pero al
introducir "sqrt" me da unos errores. En Windows lo he compilado con
un Turbo C y se ejecuta correctamente. ¿Dónde me equivoco?
Recuerda que _unos errores_ no es ser, precisamente, muy específico. La
próxima vez, pega en el mensaje los errores que son (aunque mi bola de
cristal me dice que será una "referencia indefinida").
Post by Víctor Biot Domingo
#include<stdio.h> //necesaria para printf
#include<math.h> //necesaria para sqrt (raíz cuadrada)
main()
Recuerda que el ANSI C99 ha dejado como obsoleto el int implícito, así
que mucho mejor sí declaras main como:

int main(void) {
Post by Víctor Biot Domingo
{
int i=9;
double r=0; //iniciación de la variable r
No importa, pero creo que por claridad, mejor un

double r = 0.0;

¿no? :-)
Post by Víctor Biot Domingo
r=sqrt((double)i/2);
printf("La raíz cuadrada es: %g\n", r);
El C99 declara que terminar main sin ningún return o exit significa que
habrá un "return 0;" implícito. Pero mejor utilizarlo explícitamente:

return 0;
Post by Víctor Biot Domingo
}
Bueno, la cosa es que el problema no es de compilación, el programa es
correcto, lo que te he dicho no son más que cosillas que han cambiado de
un estándar a otro. Tu problema (como me dice mi bola de cristal) es que
lo habrás compilado con gcc sin incluir la opción -lm , que es la que
hará que se incluye la librería matemática (las funciones de math.h en
linux están en una librería aparte de la estándar de C). Es decir, te
recomiendo, de momento, compilar con opciones parecidas a estas (si
utilizas el gcc 2.95.x):

gcc -W -Wall -O2 -ansi -pedantic -o prueba prueba.c -lm

Si utilizas el gcc 3.x te recomiendo algo así:

gcc -W -Wall -O2 -std=c99 -pedantic -o prueba prueba.c -lm

Ojo, estas opciones pueden hacer que aparezcan avisos en situaciones
correctas. Pero buscar si es correcto o no lo que has hecho ya te hará
aprender bastante.
Post by Víctor Biot Domingo
PS. ¿Se puede escribir en texto enriquecido (HTML) en estas news o es
obligao escribir en texto sin formato?
Hay mucha gente que utiliza lectores de correo sin la posibilidad de
leer texto HTML. Creéme si te digo que, por propia experiencia, el
99.999% de las veces el HTML no es necesario para nada. Por ejemplo, con
tres caracteres ASCII puedes resaltar el texto como quieras:

*negrita* /cursiva/ _subrayado_

Tienes unos consejos sobre el uso de las noticias aquí:

<URL: http://www.escomposlinux.org/grupos/consejos.php>

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Martin J. Sanchez
2003-11-16 19:18:17 UTC
Permalink
On Sun, 16 Nov 2003 17:27:58 +0100, Fernando Arbeiza
Post by Fernando Arbeiza
...
gcc -W -Wall -O2 -std=c99 -pedantic -o prueba prueba.c -lm
Ojo, estas opciones pueden hacer que aparezcan avisos en situaciones
correctas. Pero buscar si es correcto o no lo que has hecho ya te hará
aprender bastante.
Va en serio, siempre debes habilitar todos los warnings y errores
posibles, pero la opcion -pedantic es para paranoicos, no para
programadores. La usan Fernando Arbeiza y un par mas. ;-)

Un saludo,
Martin
Fernando Arbeiza
2003-11-16 19:53:20 UTC
Permalink
Por alusiones ;-)

On Sun, 16 Nov 2003 20:18:17 +0100, Martin J Sanchez
Post by Martin J. Sanchez
On Sun, 16 Nov 2003 17:27:58 +0100, Fernando Arbeiza
Post by Fernando Arbeiza
Ojo, estas opciones pueden hacer que aparezcan avisos en situaciones
correctas. Pero buscar si es correcto o no lo que has hecho ya te hará
aprender bastante.
Va en serio, siempre debes habilitar todos los warnings y errores
posibles, pero la opcion -pedantic es para paranoicos, no para
programadores. La usan Fernando Arbeiza y un par mas. ;-)
Tienes razón, pero yo creo que es una opción útil para quienes quieran
aprender C. Lo que no veo positivo es que alguien lea esto:

/***********************/
int main(void) {
int funcion(int i) {
switch (i) {
case 0 ... 3:
return 0;
}

return 1;
}

return funcion(({int i; i = 0 + 1; i;}));
}
/***********************/

Y piense que es (ANSI) C _sólo_ porque compila con gcc.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Xose Vazquez Perez
2003-11-23 23:59:34 UTC
Permalink
Post by Fernando Arbeiza
Tienes razón, pero yo creo que es una opción útil para quienes quieran
aprender C.
_splint_ [1], un *buen* [2] libro de C, y el estandar [3] tambien ayudan
:-)


[1] http://www.splint.org

[2]
http://cm.bell-labs.com/cm/cs/cbook/
http://www.careferencemanual.com
http://knking.com/books/c/
http://www.cs.rit.edu/~kar/pointers.on.c/

[3] http://www.sylvain-nahas.com/C_ISO99/ISO-C-FDIS.1999-04.texi.tgz

--
Software is like sex, it's better when it's bug free.

sil
2003-11-18 22:55:32 UTC
Permalink
Si pones el -lm para compilar eso tira fijo.
Post by Víctor Biot Domingo
Muy buenas.
Estoy empezando con esto del C, además de con Linux. Hasta el momento todo
lo que compilaba en Linux me iba bien, pero al introducir "sqrt" me da unos
errores. En Windows lo he compilado con un Turbo C y se ejecuta
correctamente. ¿Dónde me equivoco?
#include<stdio.h> //necesaria para printf
#include<math.h> //necesaria para sqrt (raíz cuadrada)
main()
{
int i=9;
double r=0; //iniciación de la variable r
r=sqrt((double)i/2);
printf("La raíz cuadrada es: %g\n", r);
}
Muchas gracias.
Víctor
PS. ¿Se puede escribir en texto enriquecido (HTML) en estas news o es
obligao escribir en texto sin formato?
Loading...