Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Saikilito en 26 Junio 2017, 00:07 am



Título: Libreria Math de C fuera del Dev-C++
Publicado por: Saikilito en 26 Junio 2017, 00:07 am
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 :)


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: engel lex en 26 Junio 2017, 00:09 am
es un asunto de precisión de nuestro flotante... para ver tu código...


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: Saikilito en 27 Junio 2017, 00:05 am
Aquí lo dejo, solo me da correcto con el dev-c++

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int main( void ) {
  5. int x,y,z;
  6.  
  7. x = 10;
  8. y= 2;
  9. z = pow(x,y);
  10.  
  11. printf("10 al cuadrado es igual a %i \n", z );
  12.  
  13.  
  14. return 0; }
  15.  

Y aqui unos captures  ;D


(https://image.ibb.co/mLsiOQ/prueba2.jpg) (https://imgbb.com/)
(https://image.ibb.co/hBPKxk/prueba.jpg) (https://imgbb.com/)
fotos gif (https://es.imgbb.com/)


· No hacer doble post
>aquí las reglas del foro (http://foro.elhacker.net/reglas.htm)
-Engel Lex


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: 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


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: 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.
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define obj2bin(obj) execobj2bin(&#38;#obj, sizeof(#obj))
  5.  
  6. static void execobj2bin(void *obj, size_t size) {
  7.    for(int i = size - 1; i >= 0; --i)
  8.        for(int j = 7; j >= 0; --j)
  9.            printf("%d", ((char*)obj)[i]>>j & 1);
  10. }
  11.  
  12. int main( void ) {
  13.    int x = 10;
  14.    int y = 2;
  15.    int z = pow(x,y);
  16.  
  17.    printf("10 al cuadrado es igual a %i \n", z );
  18.    printf("x = "); obj2bin(x); puts("");
  19.    printf("y = "); obj2bin(y); puts("");
  20.    printf("z = "); obj2bin(z); puts("");
  21.  
  22.    getchar();
  23. }


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: Saikilito en 27 Junio 2017, 03:22 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:


Usa algo así para depurar. Convierte las variables a double a ver que te da el programa cuando falla.
Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define obj2bin(obj) execobj2bin(&#38;#obj, sizeof(#obj))
  5.  
  6. static void execobj2bin(void *obj, size_t size) {
  7.    for(int i = size - 1; i >= 0; --i)
  8.        for(int j = 7; j >= 0; --j)
  9.            printf("%d", ((char*)obj)[i]>>j & 1);
  10. }
  11.  
  12. int main( void ) {
  13.    int x = 10;
  14.    int y = 2;
  15.    int z = pow(x,y);
  16.  
  17.    printf("10 al cuadrado es igual a %i \n", z );
  18.    printf("x = "); obj2bin(x); puts("");
  19.    printf("y = "); obj2bin(y); puts("");
  20.    printf("z = "); obj2bin(z); puts("");
  21.  
  22.    getchar();
  23. }

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



Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: 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

Código
  1. #define obj2bin(obj) execobj2bin(&#38;#38;#obj, sizeof(#obj))

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

Código
  1. obj2bin(una_variable)

en

Código
  1. execobj2bin(*una_variable, sizeof(una_variable))

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

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

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




Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: 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.


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: Saikilito en 1 Julio 2017, 21:49 pm
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

Código
  1. #define obj2bin(obj) execobj2bin(&#38;#38;#obj, sizeof(#obj))

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

Código
  1. obj2bin(una_variable)

en

Código
  1. execobj2bin(*una_variable, sizeof(una_variable))

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

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

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






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.

(https://preview.ibb.co/ffdWf5/zinjaideputacion.png)[/url]


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: MAFUS en 1 Julio 2017, 23:38 pm
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.


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: Saikilito en 1 Julio 2017, 23:56 pm
Ahora si corrio xD!
Pero es mas bien extraño xD!


(https://preview.ibb.co/fWDE2v/prueba_loca.jpg) (https://ibb.co/hoOspa)
servidores de imagenes (https://es.imgbb.com/)


Título: Re: Libreria Math de C fuera del Dev-C++
Publicado por: engel lex en 2 Julio 2017, 01:29 am
lo estás imprimiendo como float, te imprimirá decimales aunque sean ceros