Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Komodo en 25 Abril 2010, 23:19 pm



Título: ¿Loco?
Publicado por: Komodo en 25 Abril 2010, 23:19 pm
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5.  
  6. int main(){
  7.    float a=5/2;
  8. printf("%f",a);
  9. return 0;
  10. }

Output:
Citar
2.000000
Process returned 0 (0x0)   execution time : 0.062 s
Press any key to continue.

Madre mia, llevo dos dias de finde sin dormir y nose que me pasa..haber si mañana me aclaro, bueno mi duda principal es orque sale 2 y no: "2.5" ¿??¿?¿?¿?

SAludosss


Título: Re: ¿Loco?
Publicado por: Littlehorse en 25 Abril 2010, 23:23 pm
Porque estas dividiendo dos enteros:

Código
  1. float a=5/2.0;

o

Código
  1. float a=5/(float)2;

Cualquiera de las dos formas debería funcionar.

Saludos

PD: Usa títulos descriptivos para los posts.


Título: Re: ¿Loco?
Publicado por: biribau en 25 Abril 2010, 23:30 pm
Código:
float a=5/2F;
creo recordar que también chuta
Código:
float a=5/2.0;
no lo he probado, pero 2.0 no se refiero al double?, da igual cast implícito pero bueno.


Título: Re: ¿Loco?
Publicado por: Littlehorse en 25 Abril 2010, 23:52 pm
También se puede así:

Código
  1. float a=5/2.;

Código:
float a=5/2F;
creo recordar que también chuta
Código:
float a=5/2.0;
no lo he probado, pero 2.0 no se refiero al double?, da igual cast implícito pero bueno.

Las constantes de punto flotante siempre son double, el sufijo (u el cast) se utiliza en el caso que quieras especificar que sean float, pero se usa así:

Código
  1. float a=5/2.0f;
Código
  1. float a=5/2.f;

etc

Saludos


Título: Re: ¿Loco?
Publicado por: biribau en 26 Abril 2010, 01:41 am
Las constantes de punto flotante siempre son double, el sufijo (u el cast) se utiliza en el caso que quieras especificar que sean float, pero se usa así:
Pero cuando dices 2F, no es un float a cualquier nivel?, quiero decir que no hay cast en teoría, en cambio si dices float = 2.0; hay un cast implícito de double a float, aunque ya sé que el compilador el que sea lo optimizará, supongo que si lo compilasemos con cualquier cosa no habría un cast "real"...
Más concretamente yo siempre tuve la idea de que es un float a nivel de token, nunca he mirado el código del gcc, pero tendría bastante sentido, yaque se puede diferenciar de un double con una expresion regular.


Título: Re: ¿Loco?
Publicado por: Littlehorse en 26 Abril 2010, 01:56 am
Es que si haces 2F el sufijo se lo aplicas a una constante entera, ni siquiera es un sufijo valido para un entero  ;D.

Saludos!


Título: Re: ¿Loco?
Publicado por: biribau en 26 Abril 2010, 14:33 pm
Pues yo creo que es un diferenciador de token como si pones 2e0(da double), o sea, porque si pones (2+3)F no creo que funcione, claro que no es constante de cara al compilador, de hecho 2 F no se puede poner, porque no es una construccion sintática, es léxica, y a nivel léxico aun no hay tipos, sólo tokens, los tipos se asignan una vez estando en el ast, (o posiblemente antes en el analizador sintáctico). :)


Título: Re: ¿Loco?
Publicado por: Littlehorse en 26 Abril 2010, 19:17 pm
A ver, no tiene nada que ver una cosa con la otra. Que 2e0 sea double no infiere nada mas que eso, en todo caso 2e0f es float. Yo lo único que te aclare fue que esto:

Código:
float a=5/2F;
creo recordar que también chuta

es incorrecto.

En cualquiera de los casos un compilador decente optimizara en la medida de lo posible, a lo mínimo en asignaciones y en parámetros de funciones.

En cuanto al resto, no se trata de "creer". Todo código fuente en algún momento se descompone en lo que se llama "preprocessing tokens" y luego de realizar el procedimiento especifico se convierten en "tokens". Es ese resultado el que se analiza en forma semántica y sintáctica.
Igualmente la descripción de las fases de traducción siempre son conceptuales ya que siempre depende del estándar que siga el entorno que se utiliza y como se lo implemente, pero sea como sea lejos están de ser creencias.

Saludos


Título: Re: ¿Loco?
Publicado por: biribau en 26 Abril 2010, 19:59 pm
A ver, no tiene nada que ver una cosa con la otra. Que 2e0 sea double no infiere nada mas que eso, en todo caso 2e0f es float. Yo lo único que te aclare fue que esto:

Código:
float a=5/2F;
creo recordar que también chuta

es incorrecto.

En cualquiera de los casos un compilador decente optimizara en la medida de lo posible, a lo mínimo en asignaciones y en parámetros de funciones.

En cuanto al resto, no se trata de "creer". Todo código fuente en algún momento se descompone en lo que se llama "preprocessing tokens" y luego de realizar el procedimiento especifico se convierten en "tokens". Es ese resultado el que se analiza en forma semántica y sintáctica.
Igualmente la descripción de las fases de traducción siempre son conceptuales ya que siempre depende del estándar que siga el entorno que se utiliza y como se lo implemente, pero sea como sea lejos están de ser creencias.

Saludos
Tienes razón no te entendí lo de que no es 2F sino 2.F o 2.0f, crei que eran otras alternativas válidas
Cuando digo "creo" es porque no estoy seguro. No por algun tipo de fe  :laugh:
Sólo para que quede claro (lo que trataba de explicar antes *con un ejemplo incorrecto*)
Ahora lo he mirado, no es una creencia ni suposicion ni depende de la implementacion, porque C es un lenguaje con un estándar y si algo no sigue el estándar no es C, el estándar C99 es objetivo(tambien está en el C89) y pone An unsuffixed floating constant has type double. If suffixed by the letter f or F, it has type float. If suffixed by the letter l or L, it has type long double.
O sea que 2.f es float siempre, no hay ningun cast por medio, solo eso.
Perdón por el malentendido, me he liado yo solo  :silbar:


Título: Re: ¿Loco?
Publicado por: Komodo en 26 Abril 2010, 22:39 pm
Otra duda solo me llega hasta 6 decimales y yo quiero sobre 50 o por ahi.


Título: Re: ¿Loco?
Publicado por: Komodo en 26 Abril 2010, 22:46 pm
Haber me explico un ejemplo:

   float a=sqrt(2);
printf("%.181f",a);

llega un momento que solo me salen ceros, y con otros infinitos también como el numero pi y raiz de 3 y otros infinitos como el número de euhler



Título: Re: ¿Loco?
Publicado por: leogtz en 27 Abril 2010, 00:28 am
Utiliza un tipo de dato "double".

Si quisieras más decimales necesitarías librerías externas para trabajar con esos números.


Título: Re: ¿Loco?
Publicado por: biribau en 27 Abril 2010, 00:46 am
Puedes probar quizás también "long double" aunque a lo mejor es lo mismo, si no te da la precision(que es mayor cuanto mas cercano a cero sea el numero) no te queda otra que usar librerías o implementarlo tu mismo


Título: Re: ¿Loco?
Publicado por: Komodo en 27 Abril 2010, 19:27 pm
Probare long double, haber que pasa.


Título: Re: ¿Loco?
Publicado por: Komodo en 27 Abril 2010, 19:38 pm
He encontrado info sobre limits.h y respecto a mi problema de permitir más decimales, el double no me arregla nada, pues no me funciona en mi code. Probare modificando el numero de decimales permitidos.


Título: Re: ¿Loco?
Publicado por: biribau en 27 Abril 2010, 21:09 pm
Pos si eso no te vale ya solo te queda tirar de http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic (http://en.wikipedia.org/wiki/Arbitrary-precision_arithmetic)