IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Résultat d'un nombre elevé à une puissance franchement diminué !


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Résultat d'un nombre elevé à une puissance franchement diminué !
    Bonjour, mon souci est le suivant : je suis vraiment débutant en C et j'ai codé un minuscule programme pour obtenir le résultat d'un nombre choisi par l'utilisateur élevé à une puissance choisie aussi par l'utilisateur, en l'occurrence, moi.
    Pourquoi lorsque je fais effectué le calcul, avec de petits nombre le résultat est juste. Mais quand je fais l'essai avec un grand nombre avec une puissance assez grande, le résultat obtenu est arrondi avec des zéros passé le 17eme chiffre ?

    Exemple: 273^8=30853268336830129281 avec la calculatrice Windows.
    273^8=30853268336830128000 avec mon code !!! ???
    Pourquoi cet arrondi ? Il y a t' il un moyen de remédier à ce problème ? Merci d'avance.
    Le code utilisé est très simple, le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    int main()
    {
      double nombre=0,puissance =0,resultat=0;
       printf(" Entre un nombre  ");
       scanf("%lf",&nombre);
     
       printf("Entre une puissance  ");
       scanf("%lf",&puissance);
     
       resultat = pow(nombre,puissance);
     
       printf("pow egale %.0lf",resultat);  // %.0lf pour supprimer les zéros après la virgule dus aux doubles utilisés
        return 0;
    }

  2. #2
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Si tu as besoin de plus de précision le plus simple est d'utiliser le type long double (et donc powl()) introduit par le C99, qui est souvent plus précis qu'un double (tout dépend du compilateur utilisé).
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Résultat d'un nombre elevé à une puissance franchement diminué !
    Merci pour votre réponse.
    Mais comment puis je récupérer le résultat de l'opération car avec %.0lf, %d, %ld j'obtiens toujours un résultat nul ou un nombre négatif !
    Cordialement.

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Le spécificateur de format est %Lf.
    Réfères-toi au man.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Résultat d'un nombre elevé à une puissance franchement diminué !
    Bonsoir, j'ai essayé déjà sans succès. J'obtiens un résultat -0.000000.
    J'ai essayé évidement %Lf dans le scanf mais aussi %d, %lf , ...
    Je pense avoir bidouiller toutes les combinaisons.
    Comme vous le voyez je suis vraiment débutant, j'ai lu sur un forum que la fonction pow pouvait être avantageusement remplacé par un décalage de bit
    1<<a. Apparemment personne ne se sert de cette fonction !!
    Cordialement.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 49
    Points : 155
    Points
    155
    Par défaut
    Les opérateurs << et >> permettent de faire des décalages de bits en considérant l'opérande gauche comme un champ de bits.

    Ainsi, si il est utilisé avec les valeurs non signées, il correspondent à une multiplication(pou <<) et une division (>>) par 2 (pour des nombres pairs, et pour les nombres impairs, division entière par 2 avec perte du reste).

    En revanche, pour une valeur signée, l'intégrité du bit de signe n'est pas garantie, donc on ne peut pas associer de résultat arithmétique fiable à cette opération.

    Pour des valeurs à virgule flottante, chaque bit à une signification particulière (soit dans la mantisse, soit dans l'exposant, voir IEEE 754 pour plus d'infos). Il n'est donc pas possible d'affirmer avec certitude le résultat d'une opération de décalage.

    CONCLUSION: Les opérateurs >> et << sont à réserver à des variables "unsigned" pour une utilisation en tant que champ de bits et non en tant que valeur arithmétique

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Apparemment personne ne se sert de cette fonction !!
    Mais si bien sûr, on se sert de cette fonction.
    Mais je voudrais expliquer un autre point. La précision des doubles est de 15 chiffres significatifs, celle des long double de 19 chiffres. C'est déjà pas mal. Pour donner une comparaison, le rayon de la terre est défini avec 9 chiffres significatifs. Pourquoi en avez-vous besoin de plus ? Qui vous dit que les chiffres supplémentaires données par la calculatrice sont bons ? Avez-vous vérifié?
    Mettez ces trois lignes dans votre programme, et dites-nous ce que vous en pensez.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      float c=3.0/7.0;
      if (c == 3.0/7.0) printf("Egal\n");
      else printf("Différent !!\n");
    N'oubliez jamais que l'informatique est un outil pour calculer le résultat d'un problème résolu.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Résultat d'un nombre elevé à une puissance franchement diminué !
    Bonjour, j'ai essayé le code que vous me proposiez dans mon petit programme et peu importe les valeur que je saisisse j'obtiens toujours le message: différent.
    Voyant float je me doute que cela a un rapport avec la virgule ou le nombre de chiffres placés après la virgule obtenus après le calcul fait, mais je ne comprends pas le but de ce code.
    J'ai essayé de rentrer la valeur de 3 divisé par 7 pour l'élever à une puissance
    mais toujours le même message...

    Cela n'a toujours pas résolu mon problème car même en utilisant le spécificateur de format %Lf dans mon scanf avec la fonction powl() j'obtiens toujours des résultats équivalent à, c'est à dire arrondis à la fin comme dans mon exemple.
    Je n'ai pas spécialement besoin d'avoir une telle précision dans mon calcul car la plus grosse valeur, 273, est à élever à la puissance 4. Mais pour savoir si mon code était juste j'ai essayé à la puissance 8 et c'est là que je me suis aperçu de la différence.

    De plus quand vous me dites:
    Citation Envoyé par Pierre Dolez Voir le message
    N'oubliez jamais que l'informatique est un outil pour calculer le résultat d'un problème résolu.
    cela me désespère car je pensais que l'outil informatique servait justement à prévoir ou calculer une solution pour un problème auquel on avait pas la réponse !

    Je ne suis donc pas prêt de faire fonctionner mon programme qui doit me permettre de calculer la position d' un point M, placé dans un triangle isocèle, et pour lequel j'obtiendrai des distances par rapport à chaque sommet ( des longueurs ), qui ne seraient que des nombres entiers. .
    Non seulement le code du programme est un casse tête géant ! Mais si je me base sur votre assertion, je ne devrais pas pouvoir le résoudre

    Je tiens quand même à vous remercier tous pour le temps que vous prenez pour répondre à mes questions. Je continue de torturer mon processeur qui doit se lasser de mes codes qui ne lui parlent pas vraiment.
    Cordialement.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Tout d'abord je tiens à vous rassurer, tous les (bons) développeurs sont passé par là. Je pense que la cause est simple : on en a tellement dit, et surtout ceux qui n'en savent rien, qu'à moins de se remettre en question à tout moment, on a toutes les chances de faire fausse route. (Fin de philosophie.)

    Voyant float je me doute que cela a un rapport avec la virgule ou le nombre de chiffres placés après la virgule obtenus après le calcul fait, mais je ne comprends pas le but de ce code.
    Les 3 lignes de codes étaient pour vous faire prendre conscience que les chiffres ont des limites en informatique. Cet exemple, intéressant parce qu'il est très simple, provient d'un document très détaillé sur ce sujet. Mais l'exemple en lui même n'a rien à voir avec votre calcul de puissance.

    Quand je dis que l'informatique n'est qu'un outil, je peux le chanter sur tous les ton, mais il ne faut surtout pas que ça vous désespère, l'homme restera toujours plus intelligent que la machine, par contre la machine ne se trompe jamais et a beaucoup plus de mémoire, donc, on est fait pour s'entendre.

    Pour votre problème précis.
    L'impression (affichage) d'une valeur n'est pas très importante, mais surtout, l'affichage de 15 ou 17 chiffres est sans intérêt.
    La spécification de format %Lf est utilisée pour les long doubles. A moins d'avoir une très bonne raison, il vaut mieux se limiter aux double et le plus souvent aux float.
    7 chiffres significatifs, ça représente la précision de 1 mm à 10 Km, je pense que ça suffit. Par contre toutes les fonctions de calculs (sqrt, sin, cos etc) utilisent les double.

    Non seulement le code du programme est un casse tête géant ! Mais si je me base sur votre assertion, je ne devrais pas pouvoir le résoudre
    Si vous arrivez à écrire les formules pour calculer les distances aux sommets, vous arriverez à le traduire de façon que la machine vous donne le résultat. Mais si vous vous contentez de lui dire "Calcule-moi la distance du point M à chacun des 3 sommets", si elle est bien élevée, elle vos répondra "Et comment je fais?", mais dans le cas le plus probable, elle ne dira rien.
    Bonne continuation.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Résultat d'un nombre elevé à une puissance franchement diminué !
    Bonsoir, je suis désolé je n'avais pas saisi la subtilité de votre code, ce qui démontre mes lacunes dans ce domaine.

    Quand je vous disais que si je me basais sur votre assertion concernant l'outil informatique, m'amenant à conclure que je n'arriverai pas à solutionner mon problème, il va de soi que je plaisantais et je suis désolé si ma réponse n'a pas été prise dans ce sens là.

    Et je vous suis dans votre raisonnement quand vous me parlez de coder un programme, il est clair qu'il faut avoir résolu la démarche pour pouvoir l'écrire et le transmettre à la machine afin qu'elle puisse me répondre.
    Bien que de côté là je trouve que la mienne ne se comporte pas poliment dans la mesure où elle ne me répond pas , où me donne des résultats bizarres.
    La pauvre ce n'est pas de sa faute ! Le problème vient de moi qui voudrait lui faire dire quelque chose mais je ne sais pas comment lui exprimer mes requêtes du fait que je ne sache pas comment certains paramètres peuvent varier et surtout à cause de mon manque de connaissance dans ce domaine.
    Jusqu'à maintenant les seuls programmes que je réussissais était en Basic Omicron ou en Basic.
    Le langage C est un tantinet différent et plus complexe. De surcroit, le sujet qui me préoccupe est pour moi vraiment ardu par rapport aux connaissances dont je dispose.

    Voilà, je tiens de nouveau à vous remercier pour votre gentillesse et votre humour.
    Si tant est que j'arrive à progresser dans ma démarche, peut être oserai-je vous solliciter, si ce n'est pas abuser de votre temps, afin d'éclaircir certaines lacunes qui pour le moment sont des gouffres.

    Je vous souhaite une bonne soirée et espère avoir le plaisir de vous lire de nouveau.
    Cordialement.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/05/2011, 21h47
  2. Tester si un nombre est une puissance de 2
    Par AlterSid dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 07/08/2010, 10h19
  3. Savoir si un nombre est une puissance de x
    Par Hell dans le forum Mathématiques
    Réponses: 15
    Dernier message: 18/07/2008, 07h54
  4. élever un nombre x à une puissance y
    Par tom g dans le forum Langage
    Réponses: 19
    Dernier message: 05/07/2006, 08h51
  5. Elevation à une puissance
    Par Delphi-ne dans le forum Oracle
    Réponses: 2
    Dernier message: 05/01/2006, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo