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

  1. salut,
    remplace tes float en double
    à+
    0
    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.
      0
      1. Contributeur
        ou même long double jj;
        0
        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");
          }
          0
          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
            0
            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;
              0
            2. Contributeur
              @Char SnipeurSi, mais il est vrai qu'il faut include <iomanip> aussi.
              0
            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...
              0
          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!
            0
            1. Modérateur
              Peux tu nous donner ton code actuel et les valeurs que tu saisis à l'exécution ?
              0
              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 !
                0
                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.
                  0
                  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'
                    0