Libreria Math de C fuera del Dev-C++

Iniciado por Saikilito, 26 Junio 2017, 00:07 AM

0 Miembros y 1 Visitante están viendo este tema.

Saikilito

Hola! buenas tardes a todos, para empezar quiero decir que es primera ves que posteo en este foro y pues la verdad es que soy muy muy muy muy nuevo en esto de aprender a programar pero estoy bastante interesado.

Mi pregunta es, estaba viendo unos tutoriales y en una parte el sujero uso una funcion que me parecio bastante útil.

Se trataba de la la función pow(x,y) de la librería math.h

Lo que hace esta funcion es (en este caso) elevar la variable x a la potencia y

El problema que se dio es que yo uso sublimetext3 y uso el prompt de windows para compilar con minGW, probe con pow(10,2) y me dio como resultado 99, luego probe con varios numeros y la verdad es que algunos me daban bien pero otros por el contrario me daban un numero menos tal como el 10**2=99 cuando deberia ser 100

Entonces le comente a un amigo (el usa dev-c++) y le funciono de maravillas, entonces probe con bajarme ese IDE y abri el mismo archivo desde ahi y la funcion se ejecutaba a la perfección. Pero como a mi no me gusta Dev-c++ pensé en descargarme el mismo compilador así que me baje TDM-GCC que es el mismo compilador que vi que usaba el Dev-c cambie lo parámetros necesarios, comprobé su funcionamiento y sorpresa! cuando usaba la funcion pow me volvia a dar el mismo error  >:D

Por ultimo entre en las carpetas del dev-c busque en el include la libreria math.h y haciendo los respaldos convenientes sobre escribí esa libreria dentro de la carpeta del TDM-GCC y ps mate la librería pero con el respaldo la restaure aunque con el mismo error del 10**2=99

Alguien sabe que puedo hacer ? o el porque me pasa esto?
De antemano muchas gracias :)

engel lex

es un asunto de precisión de nuestro flotante... para ver tu código...
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Saikilito

#2
Aquí lo dejo, solo me da correcto con el dev-c++


#include <stdio.h>
#include <math.h>

int main( void ) {
int x,y,z;

x = 10;
y= 2;
z = pow(x,y);

printf("10 al cuadrado es igual a %i \n", z );


getchar();
return 0; }

Y aqui unos captures  ;D




fotos gif


· No hacer doble post
>aquí las reglas del foro
-Engel Lex

engel lex

a mi me da bien, aunque usualmente es un problema relacionado a coma flotante, pow es una función que retorna un valor de tipo double y lo estás asignando en un int, por la forma en que el compilador trabaja la conversión pierde precisión...

declara z como double
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

#4
Usa algo así para depurar. Convierte las variables a double a ver que te da el programa cuando falla.
#include <stdio.h>
#include <math.h>

#define obj2bin(obj) execobj2bin(&#obj, sizeof(#obj))

static void execobj2bin(void *obj, size_t size) {
   for(int i = size - 1; i >= 0; --i)
       for(int j = 7; j >= 0; --j)
           printf("%d", ((char*)obj)[i]>>j & 1);
}

int main( void ) {
   int x = 10;
   int y = 2;
   int z = pow(x,y);
   
   printf("10 al cuadrado es igual a %i \n", z );
   printf("x = "); obj2bin(x); puts("");
   printf("y = "); obj2bin(y); puts("");
   printf("z = "); obj2bin(z); puts("");
   
   getchar();
}

Saikilito

Cita de: engel lex en 27 Junio 2017, 00:16 AM
a mi me da bien, aunque usualmente es un problema relacionado a coma flotante, pow es una función que retorna un valor de tipo double y lo estás asignando en un int, por la forma en que el compilador trabaja la conversión pierde precisión...

declara z como double

:o :o :o :o :o :o

Engel tenias toda la razon, declare Z como double y ahora funciona perfectamente

Muchísimas gracias!!   :rolleyes:


Cita de: MAFUS en 27 Junio 2017, 01:39 AM
Usa algo así para depurar. Convierte las variables a double a ver que te da el programa cuando falla.
#include <stdio.h>
#include <math.h>

#define obj2bin(obj) execobj2bin(&#obj, sizeof(#obj))

static void execobj2bin(void *obj, size_t size) {
   for(int i = size - 1; i >= 0; --i)
       for(int j = 7; j >= 0; --j)
           printf("%d", ((char*)obj)[i]>>j & 1);
}

int main( void ) {
   int x = 10;
   int y = 2;
   int z = pow(x,y);
   
   printf("10 al cuadrado es igual a %i \n", z );
   printf("x = "); obj2bin(x); puts("");
   printf("y = "); obj2bin(y); puts("");
   printf("z = "); obj2bin(z); puts("");
   
   getchar();
}


Mafus la verdad es que soy tan novato con esto que no entiendo tu codigo  :huh:
Pero lo voy a probar e investigare hasta entenderlo muchas gracias por tu ayuda!   ;D


engel lex

Saikilito no intentes entenderlo XD

no vale mentira... si estás empezando carecerá de pie y cabeza, avanza un poco y lo revisas...

el define una directiva de preprocesador para escribir menos

#define obj2bin(obj) execobj2bin(&#38;#obj, sizeof(#obj))

lo que hace eso, es convertir todas las apariciones del codigo de

obj2bin(una_variable)

en

execobj2bin(*una_variable, sizeof(una_variable))

luego usa la función para recorrer el largo en bytes (que lo obtuvo de sizeof)
for(int i = size - 1; i >= 0; --i)

y luego recorrer los 8 bit de cada byte
for(int j = 7; j >= 0; --j)

mostrando si es 0 o 1
printf("%d", ((char*)obj)[i]>>j & 1); //si, así se ve más complicado que explicado


El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

Como dice engel lex no intentes entenderlo, por ahora, úsalo como una caja negra. Algo como printf que simplemente usas.

Saikilito

Cita de: engel lex en 27 Junio 2017, 03:34 AM
Saikilito no intentes entenderlo XD

no vale mentira... si estás empezando carecerá de pie y cabeza, avanza un poco y lo revisas...

el define una directiva de preprocesador para escribir menos

#define obj2bin(obj) execobj2bin(&#38;#obj, sizeof(#obj))

lo que hace eso, es convertir todas las apariciones del codigo de

obj2bin(una_variable)

en

execobj2bin(*una_variable, sizeof(una_variable))

luego usa la función para recorrer el largo en bytes (que lo obtuvo de sizeof)
for(int i = size - 1; i >= 0; --i)

y luego recorrer los 8 bit de cada byte
for(int j = 7; j >= 0; --j)

mostrando si es 0 o 1
printf("%d", ((char*)obj)[i]>>j & 1); //si, así se ve más complicado que explicado






Cita de: MAFUS en 27 Junio 2017, 07:45 AM
Como dice engel lex no intentes entenderlo, por ahora, úsalo como una caja negra. Algo como printf que simplemente usas.


Chicos disculpen la ausencia estoy un poco atareado con la universidad, aun así sigo aprendiendo poco a poco algunas cosas.  ;)

Ahora, pues xD aun con la explicación sigue siendo bastante confuzo jaja asi que supongo que ya llegara mi momento de entenderlo xD! pero tengo el archivo bien respaldadito en la nube para releerlo al 100%  cuando ya sea capas. Muchas gracias por eso.

Ahora lo otros ps si estoy bastante apenado la verdad es que cuando probé el código no me corrió :/ no se si es que tenga un problema con mi compilador o es que tengo mis entendederas bien cerrada pero no me corre mas bien me da un error, así que mas difícil aun se me hace comprender como es eso de usarlo tipo depurador xD! les dejo un capture, y pues de verdad muchísimas gracias por tomarse el tiempo de enseñarme.

[/url]

MAFUS

#9
El código del define es este
#define obj2bin(obj) execobj2bin(&#obj, sizeof(#obj))
Lo que pasa es que, por alguna razón, la etiqueta code suma caracteres de más.