Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: xoker en 19 Julio 2014, 11:16 am



Título: Double en C
Publicado por: xoker en 19 Julio 2014, 11:16 am
Buenas a todos, vereis despues de muchisimo tiempo me he encontrado con un problema con los double en C, es con el siguiente codigo:

Código:
#include <stdio.h>

int main(){

double a;

printf("Introduce un valor: ");
scanf("%f",&a);

printf("%f",a);

system("pause");
return 0;
}

Como podeis ver, no puede ser un codigo mas tonto, leo un double por teclado y lo imprimo por pantalla. Pues bien, introduzca el numero que introduzca, siempre me sale 0 por pantalla, tras pasarle el depurador, sucede que en el momento de hacer el scanf lo que lee no es el numero que yo meto, sino que introduce en la variable un numero en notacion cientifica bajisimo, muy proximo a cero, por eso por pantalla aparece el cero. Tambien he probado a quitar el scanf y darle yo un valor a mano a la variable y se imprime correctamente, por lo que confirmo que la culpa es del scanf.

Para solucionar este error, lo que he hecho a la hora de leer por teclado es sustituir scanf("%f", &a); por scanf("%lf",&a); es decir, en vez de usar %f uso %lf y ya funciona correctamente.

¿Es todo esto normal? Yo juraria que en mis mas de dos años usando C, nunca he tenido este problema. Realmente no me ha ocurrido a mi originalmente, le ocurrio a un amigo y cuando fui a probar en mi PC tambien ocurria lo mismo, ambos tenemos el compilador MingGW GCC 4.8.1.

Por ultimo, he mirado en internet y libros y todos lo hacen como yo  :o, con un scanf("%f",...).

Un saludo.


Título: Re: Double en C
Publicado por: CalgaryCorpus en 19 Julio 2014, 12:08 pm
Lo que un compilador tiene que implementar es que
sizeof float sea menor o igual a sizeof double.

Sospecho que en ese compilador el primer sizeof es menor estricto que el segundo, lo que hace razonable el comportamiento que obtienes.


Título: Re: Double en C
Publicado por: MeCraniDOS en 19 Julio 2014, 12:09 pm
El problema se soluciona como tu dices, cambiando el %f por %lf
Código
  1. scanf("%lf",&a);
  2.  
Código
  1. printf("%lf",a);
  2.  

De todas formas ese error te lo da el compilador  :rolleyes:

Citar
aviso: formato ‘%f’ espera un argumento de tipo ‘float*’, pero el argumento 2 es de tipo ‘double*’ [-Wformat]

Saludos


Título: Re: Double en C
Publicado por: xoker en 19 Julio 2014, 13:27 pm
Ya la verdad que tengo curiosidad, os ha pasado a vosotros anteriormente? es esto algo nuevo de la ultima version del compilador?

La verdad que me he llevado una gran sorpresa!


Título: Re: Double en C
Publicado por: CalgaryCorpus en 20 Julio 2014, 17:00 pm
La especificacion del lenguaje indica que sizeof(float) <= sizeof(double), esto permite que algunos compiladores tomen la opcion de hacerlos de igual tamaño y otros hacer que el double use mayor tamaño.

Un codigo escrito leyendo un double usando %f es un codigo no portable de un compilador a otro.