Double en C

Iniciado por xoker, 19 Julio 2014, 11:16 AM

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

xoker

Buenas a todos, vereis despues de muchisimo tiempo me he encontrado con un problema con los double en C, es con el siguiente codigo:

#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.

CalgaryCorpus

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.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

MeCraniDOS

El problema se soluciona como tu dices, cambiando el %f por %lf

scanf("%lf",&a);


printf("%lf",a);


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

Citaraviso: formato '%f' espera un argumento de tipo 'float*', pero el argumento 2 es de tipo 'double*' [-Wformat]

Saludos
"La física es el sistema operativo del Universo"
     -- Steven R Garman

xoker

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!

CalgaryCorpus

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.

Aqui mi perfil en LinkedIn, invitame un cafe aqui