¿Loco?

Iniciado por Komodo, 25 Abril 2010, 23:19 PM

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

Komodo

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


int main(){
    float a=5/2;
printf("%f",a);
return 0;
}


Output:
Citar2.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


Littlehorse

Porque estas dividiendo dos enteros:

float a=5/2.0;

o

float a=5/(float)2;

Cualquiera de las dos formas debería funcionar.

Saludos

PD: Usa títulos descriptivos para los posts.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

biribau

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

Littlehorse

También se puede así:

float a=5/2.;

Cita de: biribau en 25 Abril 2010, 23:30 PM
float a=5/2F; creo recordar que también chuta
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í:

float a=5/2.0f;
float a=5/2.f;

etc

Saludos
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

biribau

Cita de: Littlehorse en 25 Abril 2010, 23:52 PM
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.

Littlehorse

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!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

biribau

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). :)

Littlehorse

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:

Cita de: biribau en 25 Abril 2010, 23:30 PM
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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

biribau

Cita de: 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:

Cita de: biribau en 25 Abril 2010, 23:30 PM
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:

Komodo

Otra duda solo me llega hasta 6 decimales y yo quiero sobre 50 o por ahi.