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++Builder Discussion :

fonction math : pow()


Sujet :

C++Builder

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut fonction math : pow()
    Bonjour,

    J'ai un etrange comportement de ma fonction pow() de <math.h>
    En effet, pow(0,0) génére une erreur alors que le résultat devrait etre 1.
    Ce que me donne dailleurs d'autre compilateur sous linux.
    Quelqu'un a deja observé ca, ou es-je un souci dans mon BDS6
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    uriotcea a ecrit:
    Bonjour,

    J'ai un etrange comportement de ma fonction pow() de <math.h>
    En effet, pow(0,0) génére une erreur alors que le résultat devrait etre 1.
    Ce que me donne dailleurs d'autre compilateur sous linux.
    Quelqu'un a deja observé ca, ou es-je un souci dans mon BDS6
    Merci d'avance
    voila ce que donne l"aide
    Prototype

    double pow(double x, double y);

    long double powl(long double x, long double y);
    #include <math.h>
    #include <stdio.h>

    int main(void)
    {
    double x = 2.0, y = 3.0;

    printf("%lf raised to %lf is %lf\n", x, y, pow(x, y));
    return 0;
    }

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui, et alors ????

  4. #4
    Membre éprouvé
    Avatar de bandit boy
    Profil pro
    Inscrit en
    Février 2006
    Messages
    916
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 916
    Points : 1 007
    Points
    1 007
    Par défaut
    Dans l'aide j'ai ca:
    On success, pow and powl return the value calculated of x to the power of y.

    Sometimes the arguments passed to these functions produce results that overflow or are incalculable. When the correct value would overflow, the functions return the value HUGE_VAL (pow) or _LHUGE_VAL (powl). Results of excessively large magnitude can cause the global variable errno to be set to

    ERANGE Result out of range

    If the argument x passed to pow or powl is real and less than 0, and y is not a whole number, or if x is 0 and y is less than 0, or you call pow(0,0), the global variable errno is set to

    EDOM Domain error

    Error handling for these functions can be modified through the functions _matherr and _matherrl.
    Il faut que x (dans x^y) soit strictement supérieur à 0. Je suppose donc que tu dois avoir une erreur de domaine. Ce n'est pas propre, mais si tu veux parer cette erreur, tu dois tester avant si x=y=0 et parer donner directement le résultat que tu connais.

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui ca je l'ai fait!
    Mais moi j'attendais d'une fonction mathématique quelle renvoie la valeur correcte et pas une erreur.
    Zero à la puissance zero doit donner 1. C'est mathématiquement vrai et simple. D'autres compilateurs essayés me donnent bien ce résultat attendu. D'ou ma surprise.
    Dans le meme genre j'ai vue que certaine fonction tel que atan() donne aussi des resultats faux pour la library fastmath.h
    Franchement je trouve toutes ces erreurs trés graves.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    En mathématique zéro à la puissance zéro est indéterminé :
    5 à la puissance 0 =1
    0 à la puissance 3 = 0;

    Alors 0 à la puissance 0 ?

  7. #7
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Un peut de math sur les limites, meme si c'est pas le bon forum!
    Mathématiquement, on voit que quelque soit le nombre au voisinage de 0, la valeur de la dérivée de la fonction "mise à la puissance 0" est nulle, et la valeur de la fonction dans ce même voisinage vaut 1. Donc par continuité de la fonction (pour la rendre continue, ce dont on a raisonnablement le droit puisqu'elle est dérivable en tout point sauf en zéro et avec la même valeur) on peut affirmer que 0 puissance 0 vaut 1 en prolongeant la fonction en 0.

  8. #8
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Bonjour,

    Informatiquement: si vous voulez respecter une convention pow(0, 0) == 1 sans modifier votre code, c'est peut-être hérétique mais ça marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define pow(x, y) ((x)==0)&&((y)==0)?1:pow((x),(y))
    double x = 0.0;
    double y = 0.0;
    AfficheUneLigne(pow(x, y));
    #undef pow(x, y)
    AfficheUneLigne(pow(x, y));
    #define #undef dans chaque unité qui utilise pow() bien sûr.

    Pour l'aspect mathématique, je ne sais pas ce que sont les conventions, c'est trop vieux. pow(x, y), c'est exp(y * ln(x)). Si on passe aux limites, votre raisonnement pour montrer que pow(0, 0) doit valoir 1 embarque sa propre contradiction. (je rappelle que je ne sais pas ce que disent les mathématiques formelles).

    - Pour tout x, x puissance 0 vaut 1. Donc, effectivement, 0 puissance 0 en étant la limite quand x tend vers 0, 0 puissance 0 vaut 1.

    MAIS

    - Pour tout y, 0 puissance y vaut 0. Donc, 0 puissance 0 en étant la limite quand y tend vers 0, 0 puissance 0 vaut 0.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Au collège, on s'en sert habituellement lorsque y est un nombre entier. Voici un rappel de quelques règles :

    * Si y > 0, x^y = x × x × ... × x (avec y facteurs).
    * Si y = 0 (et x non nul), x^y = x0 = 1.
    * Si y < 0 (et x non nul), x^y = 1/(x-y) = 1/(x × x × ... × x)

    On peut déjà formuler certaines remarques qui vont rester vraies lorsque y ne sera pas entier :

    * [Remarque 1] : Lorsque x = 0, x^y n'est pas défini pour y ≤ 0

    * [Remarque 2] : Si x est non nul, x0 = 1

    * [Remarque 3] : Pour y < 0, xy = 1/(x-y)

    etc...

  10. #10
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Oui, j'ai efffectivement mon raisonnement sur les limites est valable pour 0^0=1 & 0^0=0
    En fait c'est une convention qui peut efectivement etre changé sans violer aucun loi mathematique.

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je suis tres loin d'etre matheux mais quand je fais 0^0 sur une calculette scientifique elle me sort une erreur?

  12. #12
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Si tu fait 25^2569 ca fait erreur aussi, pourtant c'est bien defini!
    Une calculatrice n'est pas vraiment une démonstration mathematique.
    Voici un lien pas mal (enfin pour les mateux) expliquant bien cette indetermination

    http://faq.maths.free.fr/texte/faq13.html

  13. #13
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Voici un lien pas mal (enfin pour les mateux) expliquant bien cette indetermination
    Je n'ai pas tout lu, mais il semble qu'il s'agisse de quatre approches mathématiques. En informatique, il faut ajouter une approche par la sémantique. Si on a double f(double x, double y) qui retourne x^y, on retombe sur l'approche mathématique, c'est à dire indéterminantion.
    Si on a une famille de fonctions double fX(double y) qui retourne X^y où X est une constante de la fonction, il est logique que 0^0 retourne 0, parce que f0() sera la constante 0.
    Si on a une famille de fonctions double fY(double x) qui retourne x^Y où Y est une constante de la fonction, il est logique que 0^0 retourne 1, parce que f0() sera la constante 1.

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

Discussions similaires

  1. Problème fonction Math.pow
    Par suNiz dans le forum Débuter avec Java
    Réponses: 21
    Dernier message: 13/01/2012, 12h47
  2. Réponses: 1
    Dernier message: 25/12/2006, 16h03
  3. la fonction puissance pow() ? entier, réel ?
    Par italiasky dans le forum C
    Réponses: 9
    Dernier message: 03/12/2006, 17h41
  4. coordonnées géométriques et fonctions maths
    Par passie dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/09/2006, 13h27
  5. aide fonction math[racine,cos(),sin(),..]VB6
    Par am.adnane dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/12/2005, 18h40

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