2012-03-25 21 views
6

No estoy seguro de lo que estoy haciendo mal, pero no puedo leer un doble desde la consola. Leer y funciona bien por alguna razón. Estoy usando Xcode.scanf no funciona. necesito leer el doble desde la consola

double n1; 

// get input from the user 
printf("Enter first number: "); 
scanf("%f", &n1); 

printf("%f", n1); 

Esto siempre imprimirá 0 independientemente de lo que ingrese.

Respuesta

6

%f está buscando un flotador, no un doble. Si desea utilizar un doble, use el formato %lf.

Como un lado algo interesante, clang advierte sobre esto sin ninguna bandera adicional, gcc 4.6 no lo advertirá incluso con -Wall -Wextra -pedantic.

+0

Afortunadamente GCC 5.2.1-22ubuntu2 se queja sin argumentos –

4

%f es para un single precision floating-point value (flotador). El especificador de formato que necesita es %lf, que significa long precision floating-point value (doble).

2

Todo se trata de cómo se almacenan los datos en la memoria.
Déjame decir primero cuánto tiempo y el flotador se almacenan en la memoria.

  • Un doble (float de largo, 64 bits) se almacena en la memoria como o this (notación poco endian).
  • Donde como un flotante (32 bits) se almacena como this (notación little endian).
    también echar un vistazo a este "en.wikipedia.org/wiki/Floating_point#Internal_representation" (todos los tipos de datos flotantes)

Así que aquí está pidiendo a tomar la entrada como %f (es decir, flotador, que es 4 bytes pero el doble tiene 8 bytes), por lo que el compilador toma la entrada desde la consola y la convierte a tipo flotante y la almacena en la ubicación de la memoria (que en realidad es de 8 bytes) de la variable (aquí n1).

+0

little endian y big endian http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html – Chokho

Cuestiones relacionadas