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 incohérent de pow, sqrt


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut Résultat incohérent de pow, sqrt
    Je développe depuis quelques temps (sans dire que je sui expert), et je rencontre en ce moment un procblème qui me laisse perplexe. J'essaie d'utiliser les fonctions sqrt (racine carrée) et pow (puissance). Ces fonctions me retournent des valeurs tout à fait abérentes:
    - Pour sqrt(4), j'obtiens 0
    - pour pow(2, 2), j'obtiens ... 1075231776 ( )

    J'ai beau caster les chiffres ou les variables... rien ne change. J'inclus bien entendu stdio.h, et même avec math.h, toujours le même problème. Je compile avec gcc et les options -lm -o. Je suis sous LINUX Mandrake 10.1 ... quelqu'un a des idées :

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, c'est très bizarre en effet.
    Essaye alors avec cmath.h
    je n'ai rien de plus intelligent à te dire... car je suis très étonné de tes sorties.

    En espérant que cette très maigre aide te rendra service...

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On peut voir le code en question ? (calcul + affichage)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Re-salut, je crois que stdio est pour le C. Essaye iostream.

    Essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<iostream>
    #include<math.h>
    using namespace std;
     
    int main()
    {
    cout<<pow(4.,0.5)<<" "<<sqrt(4.)<<" "<<pow(2.,2.)<<endl;
    return 0;
    }

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    ... ça marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test.c:7:22: iostream.h: No such file or directory
    précision supplémentaire: je compile avec gcc et je suis en environnement Gnome, des fois que ça puisse changer des choses (je suis relativement novice sous Linux)

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    http://c.developpez.com/faq/cpp/?pag...le#SL_iostream

    Mais bon de toute façon ton problème ne vient pas de là. A moins que tu utilises printf et le mauvais formateur.

    test.c
    Tu fais du C :

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 52
    Points : 34
    Points
    34
    Par défaut
    bonjour tout le monde !

    On peut voir ton code ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut PierrotY, je te confirme que mon code précédent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<iostream>
    #include<math.h>
    using namespace std;
     
    int main()
    {
    cout<<pow(4.,0.5)<<" "<<sqrt(4.)<<" "<<pow(2.,2.)<<endl;
    return 0;
    }
    dont la ligne de compilation est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g++ mon_fichier.cpp -Wall -o out;./out
    me renvoie

    donc le pb ne vient ni de la fct sqrt, ni de math.h, ni de pow, ni de iostream

    Essaye déjà de compiler ce petit code et dit nous si ca marche.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Tout à fait... ça marche bien.
    Je ne pense pas que ça vienne de gcc (qui à priori est un alias de g++ ... ou l'inverse plutôt), mais de mes options de compil.
    Moi j'utilise Et dans test.c, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <stdio.h>
    #include <math.h>
     
    int main(){
    	printf("sqrt(4.) = \n", sqrt(4.));
    }
    Vu le nombre de ligne... je dois être bigleux ... ou fatigué

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf("sqrt(4.) = %lf\n", sqrt(4.));
    ...

    en fait, ça semble marcher avec -Wall ... Mais pourtant, -lm devrait suffir non?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Bon, si vous n'avez pas d'idées, ne vous cassez plus la tête, ... ça remarche! Mais n'allez pas croire que j'ai halluciné ... Je recompile dans les même conditions qu'avant, ben ça marche. Ca s'est débloqué quand j'ai mis (une fois) l'option -Wall.

    Bref, merci pour votre temps et vos idées, et à plus!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, l'option -Wall affiche tous les warning, mais comme ici il n'y en a pas (vu le très petite taille du prgm), je pense qu'elle en sert à rien.
    Je crois (mais je ne suis vraiment sûr) que l'option -lm est utile quand on compile plusieurs fichiers .cpp à l'aide d'un makefile, mais je répète que je ne suis pas très sûr de cette affirmation.

    Tuas écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
    #include <math.h>
     
    int main(){
       printf("sqrt(4.) = \n", sqrt(4.));
    }
    Pourquoi, comme ta fct main() renvoie un int, ne fais-tu pas plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <math.h>
     
    int main(){
       printf("sqrt(4.) = \n", sqrt(4.));
    return 0;
    }
    Tu dis :
    ça semble marcher avec -Wall
    Ca marche ou ca ne marche pas ?

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    ah, désolé, je n'avais pas vu que tu avais résolu ton pb. Tu as posté ton message avant le mien...

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    gcc -o test test.c -lm
    Tu fais du C... Il y a un forum C juste au dessus

    A part ça, il manque le formateur dans ton printf (%machin), donc ça ne peut qu'afficher n'importe quoi.

  15. #15
    Membre habitué Avatar de PINGOUIN_GEANT
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 149
    Points : 155
    Points
    155
    Par défaut
    normalement il a besoin de -lm, cela sert à linker la bibliothèque dynamique standard math, ce qui n'est pas fait par défaut. mais gcc doit le faire implicitement
    " Tout homme est digne d'un parapluie." Stavroguine dans Les Démons de Dostoïevski.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 85
    Points : 80
    Points
    80
    Par défaut
    Explication (finale?...).
    J'utilise en effet gcc en utilisant des fichier .c Mais lorsqu'on regarde le man du gcc, celui-ci nous dit "gcc - compilateur C et C++ du projet GNU" ... donc, de ce côté-là, pas de problème. Comme je ne saivait pas quoi prendre en compte (le compilateur ou le langage), j'ai pris le premier venu.

    Mais bon, le problème n'est pas là. Pour la petite histoire, j'ai démarré (ma carrière ... 8) ) avec le C, puis je suis passé au PHP ( ) pour revenir quelques années après au C ( ). Mon passage en PHP m'a fait oublier certaines notions de compatibilités des types de variables... ce qui est la cause du présent problème. En effet, mélanger des variables de différents types (entiers, réels, long, ...) ... ben parfois, fait planter le programme complètement. L'erreur n'apparaît pas à la compilation (ou alors en rajoutant -Wformat par exemple), mais est bien présente à l'exécution.

    Voilà, je pense que mon problème est maintenant [Résolu] . En tout cas, si quelqu'un connait une évolution du C qui se fout des déclarations de variables... je suis preneur.

    Bonne continuation à tous!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. group by et résultat incohérent
    Par Teppic dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/02/2009, 14h34
  2. [A-03] Résultat incohérent après suppression d’enregistrement
    Par salkama dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/10/2008, 15h53
  3. Résultat incohérent de la fonction strlen()
    Par kaayna dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2008, 17h35
  4. Réponses: 3
    Dernier message: 25/03/2008, 03h00
  5. Résultat incohérent en utilisant NLS_DATE_LANGUAGE
    Par Liberte Outremer dans le forum SQL
    Réponses: 2
    Dernier message: 25/06/2007, 17h16

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