Printf-scanf grand nombre C++

Bonjour,
Mon petit programme ne m'affiche pas la valeur que j'ai entré.
Si je lui donne 2454329.666326 , il m'affiche 2454329.750000.
Or il me faut toute les décimales pour la suite des calculs.
Voici le programme:

#include <stdio.h>
#include <iostream>

float jj;

main()
{
printf ("Entrez la date en jours juliens:\n");
scanf("%f",&jj);
printf("La date en juliens est: %14.6f\n",jj);
system("PAUSE");
}

Tout réponse est la bienvenue. Merci.
Configuration: Windows XP
Firefox 2.0.0.11

10 réponses

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    Salut.
    en informatique, les nombre ont des précisions selon le type choisi.
    Ainsi, un float semble avoir une précision de 10^-9, tandis qu'un double a une précision de 10^-15.
    Autrement dit, l'ordinateur ne stocke qu'une partie d'un nombre décimal : 9 chiffres pour les float et 15 pour les doubles. Ensuite, il stock la puissance de 10 associer, mais c'est tout.
    1. #include <stdio.h>
      #include <iostream>
      long double jj;
      main()
      {
      cout<<"Entrez la date en jours juliens:"<<endl;
      cin>>jj;
      cout<<"La date en juliens est: <<jj<<endl;
      system("PAUSE");
      }
      1. Modérateur
        La version de <4> codée correctement :
        #include <iostream>
        #include <cstdio> // pour les windowsiens
        
        int main(){
            long double jj;
            std::cout << "Entrez la date en jours juliens:" << std::endl;
            std::cin >> jj;
            cout << "La date en juliens est:" << jj << std::endl;
            getchar(); // pour les windowsiens
            return 0;
        }

        Note que la méthode precision peut être appliquée à std::cout en vue de changer le nombre de chiffres significatifs. Exemple :
        #include <iostream>
        #include <cstdio> // pour les windowsiens
        
        int main(){
            double x = 1.23456789;
            std::cout.precision(2);
            std::cout << x << std::endl;
            std::cout.precision(5);
            std::cout << x << std::endl;
            getchar(); // pour les windowsiens
            return 0;
        }
        

        Bonne chance
        1. Contributeur
          Olalal ! Tu as oublié un std:: au deuxième cout !!!
          Honte sur toi.
          D'après la doc, tu peux aussi utiliser des manipulateur pour la precision :
          std::cout<<std::setprecision(3)<<x<<std::setprecision(15)<<x<<std::endl;
        2. Contributeur
          @Char SnipeurSi, mais il est vrai qu'il faut include <iomanip> aussi.
        3. Modérateur
          @Char SnipeurAh oui, effectivement au temps pour moi. Par contre je n'ai jamais inclu <iomanip> et ça marche très bien chez moi. Enfin bref...
      2. Merci pour toutes ces réponses.
        En utilisant "long double" ça marche parfaitement.
        En revanche avec "double" ça ne marche pas.
        Si je lui donne 2454329.666326 , il m'affiche 6.140953e-315 .
        Or normalement les double vont de -1.7*10^-308 à 1.7*10^308.
        Quelqu'un sait-il pourquoi?
        A plus!
        1. Modérateur
          Peux tu nous donner ton code actuel et les valeurs que tu saisis à l'exécution ?
          1. Voici mon code:

            #include <stdio.h>
            #include <iostream>

            double jj;

            main()
            {
            printf ("Entrez la date en jours juliens:\n");
            scanf("%e",&jj); // float ne prend que 6 chiffres avant et aprés la virgule; au dessus ça deconne */
            printf("La date en juliens est: %e\n",jj);
            system("PAUSE");
            }

            Si je saisis la valeur 2454329.666326 , il m'affiche 6.140953e-315 !
            1. Modérateur
              C'est une blague ? Ca sert à quoi qu'on te donne un code qui marche (cf <5>) (qui pour le coup est un code C++ et non un code C comme celui que tu proposes) ?

              Comment corriger ton programme :
              Ton main a pas de valeur de retour, ton system("PAUSE") est spécifique windows, et les printf sont sensés être fait avec un %lf ou un %g.
              1. Contributeur
                j'utlise régulièrement le '%e' pour la sortie des double, je n'ai jamais eu de problème.
                par contre, je viens de tester, pour le scanf, '%e' ne fonctionne pas en effet. utilise comme le dit mamiemando '%lf'