scanf ne fonctionne pas. besoin de lire le double de la console

Je ne suis pas sûr de ce que je fais mal, mais je ne parviens pas à lire un double de la console. Lire un livre fonctionne bien pour une raison quelconque. J’utilise Xcode.

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

Ce sera toujours imprimer 0, peu importe ce que je saisis.

%f recherche un float, pas un double. Si vous souhaitez utiliser un double, utilisez le format %lf .

Comme côté intéressant, clang prévient cela sans aucun drapeau supplémentaire, gcc 4.6 ne le préviendra même pas avec -Wall -Wextra -pedantic .

%f est destiné à une single precision floating-point value (float). Le spécificateur de format dont vous avez besoin est %lf , ce long precision floating-point value signifie long precision floating-point value (double).

Son tout sur la façon dont les données sont stockées en mémoire.
Laissez-moi d’abord dire que combien de temps et float sont stockés en mémoire.

  • Un double (long float, 64 bits) est stocké en mémoire comme ou ceci (notation peu endian).
  • Où en tant que float (32 bits) est stocké comme ceci (notation little endian).
    Jetez également un coup d’oeil à cette “en.wikipedia.org/wiki/Floating_point#Internal_representation” (tous les types de données flottants)

Donc ici vous demandez de prendre l’entrée en tant que %f (ie float, qui est de 4 octets mais le double est de 8 octets), donc le compilateur prend l’entrée de la console et le convertit en type float et le stocke à l’emplacement de mémoire (qui est en fait de 8 octets). ) de variable (ici n1 ).