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 :

Fonction cosinus en C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut Fonction cosinus en C
    Bonjour à vous !

    Je suis débutant en C et j'essaye d'implémenter la fonction cosinus. Cependant, j'obtiens toujours le message d'erreur : "conflicting types for built-in function 'cos'"

    voici mon code :

    cos.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "power.h"
    #include "facto.h"
     
    double cos (double x, int n)
    {
      double s;
      int i,k;
      s=0;
      k=0;
      for (i=0;i<=n;i=i+2) {s=s+(power(x,i)*power(-1,k))/facto(i); k=k+1;}
      return(s);
    }

    cosmain.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include "facto.h"
    #include "power.h"
    #include "cos.h"
     
    int main ()
    {
      int n;
      double x;
      printf("Indiquez le calcul souhaité sous la forme cos(x),n\n");
      scanf("cos(%lf),%d",&x,&n);
      printf("%lf\n",cos(x,n));
      return(0);
    }

    cos.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double cos (double x, int n);

    Je ne vous ai pas remis les fonctions facto et power car je les ai déjà testées et elles fonctionnent (en créant de même un powermain.c)


    Voilà j'espère que vous pourrez m'aider. L'erreur est la même et porte sur cos.c et cos.h.

    Merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 89
    Par défaut
    Hello Flav78,

    Tu essaies (je pense) de redefinir une fonction qui est deja existante dans ton environnement de travail... Essaie en renommant ta fonction cos (appelle la par exemple my_cos) ou, si tu veux garder le meme nom, supprime le header qui contient deja la fonction cosinus

    Bonne continuation !

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Par défaut
    Merci pour ta réponse rapide !

    J'ai remplacé cos par cosinus et effectivement ça marche !
    Par contre je ne comprends pas pourquoi ça ne marchait pas avant sachant que je n'avais pas mis #include <math.h> qui contient justement cos.

    Merci

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Inclure <math.h> permet de connaitre le prototype de la fonction (et non sa définition [= implémentation] entière). Je pense que l'erreur que tu as a été émise par ton éditeur de liens. Une fois tous les morceaux compilés, cet éditeur les assemble pour créer le programme. A ce moment là, il doit trouver ta fonction cos() et la fonction cos() de sa bibliothèque. Tu dois pouvoir faire la même chose avec malloc() sans inclure stdlib.h et printf() sans inclure stdio.h.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Il est aussi probable que tu aies inclus certains headers qui — eux — ont inclus <math.h> à un niveau ou à un autre pour leurs propres dépendances.

    Par ailleurs, selon la façon dont ton compilateur est réglé, il se peut qu'il estime que la bibliothèque mathématique fasse partie des fondamentaux également et te l'inclue de façon implicite.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flav78 Voir le message
    Par contre je ne comprends pas pourquoi ça ne marchait pas avant sachant que je n'avais pas mis #include <math.h> qui contient justement cos.

    Merci
    Salut
    Un header ne contient pas de fonction mais seulement leurs signatures (type et paramètres).
    Les fonctions sont situées dans des librairies (libm pour le cosinus). Et comme le dit Obsidian, il est probable que ton compilo l'ait incluse automatiquement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Le problème ne vient pas du lien avec la bibliothèque mathématique (libm) ou de l'inclusion automatique de math.h. C'est une particularité de gcc qui est la cause du problème. Ce compilateur redéfinit cos, entre autres fonctions, avec une macro interne pour des raisons d'efficacité.

    Il est possible d'éviter le message "conflicting types for built-in function 'cos'" en utilisant l'option fno-builtin-xxx:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc ... -fno-builtin-cos ...

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ce matin, j'ai essayé d'avoir le même message d'erreur avec malloc() ou puts() et je n'y suis pas arrivé. Je me suis ensuite souvenu que gcc définissait sa propre fonction cos() et je me suis demandé si ce n'était pas ça qui causait le warning. Merci d'avoir confirmer cette hypothèse !

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    C'était quand même évident vu qu'il y avait "built-in" dans le message...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 838
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flav78 Voir le message
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i=0;i<=n;i=i+2) {s=s+(power(x,i)*power(-1,k))/facto(i); k=k+1;}
    Petite astuce: quand deux variables évoluent en parallèles (comme ici "i" et "k"), tu peux les grouper dans le for. Ca accentue la notion de "groupe"...
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (i=0, k=0;i<=n;i+=2, k++)
        s=s+(power(x,i)*power(-1,k))/facto(i)

    Autre astuce: ici la factorielle de i sera calculée à chaque itération. Donc à l'itération 5, il caclulera facto(5). Et à l'itération 6, il calculera facto(6) ce qui revient à recalculer facto(5) pour multiplier le résultat par 6.
    Tu peux éviter ces redondances (surtout pour une factorielle qui est super gourmande en temps). Bon ici c'est plus sioux parce que i monte de 2 en 2 mais c'est quand-même faisable.

    Et 3° astuce: au départ de la boucle, i et k valent 0. Donc power(x, 0) vaut 1 et power(-1, k) vaut aussi 1. Et facto(i) vaut aussi 1. Bref s vaut 1. Donc tu peux directement partir de 1...

    Ce qui donnerait le code suivant
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    double cos (double x, int n)
    {
      double s=1.0;
      unsigned int i,k;
      unsigned long f=1;
      for (i=2, k=1;i<=n;i+=2, k++)
     {
        f=f*(i-1)*i;
        s=s+(power(x,i)*power(-1,k))/f;
     }
     return s;
    }

    Dernière astuce mais là très très subtile: je présume que la variable "n" sert à limiter le développement pour ne pas partir dans l'infini.
    Eh bien il y a une façon de limiter le développement sans utiliser de variable choisie par l'utilisateur: utiliser la limite du processeur lui-même. En effet, il te suffit de mémoriser le calcul de chaque itération et ensuite le comparer au calcul suivant. Et lorque le processeur ne sera plus capable de faire la différence, cela veut dire qu'il a atteint sa limite de calcul et dans ce cas on peut quitter la boucle. Ce qui donnerait
    Code c : 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
    double cos (double x)
    {
      double s=1.0;
      double mem=0;
      unsigned int i=2,k=1;
      unsigned long f=1;
      while (1)
     {
        f=f*(i-1)*i;
        s=s+(power(x,i)*power(-1,k))/f;
        if (s == mem) break;
        mem=s;
        i+=2;
        k++;
     }
     return s;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Probleme fonction cosinus et sinus
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 8
    Dernier message: 12/12/2011, 15h38
  2. [Turbo Pascal] Fonction Cosinus avec les sommes partielles
    Par max0u13 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 13/02/2011, 22h54
  3. Fonction ARC COSINUS
    Par xime78 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 21/11/2008, 21h47
  4. Fonction sinus et cosinus
    Par danathane dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 14/10/2008, 16h21
  5. Affiner une courbe à l'aide d'une fonction cosinus
    Par momo032114 dans le forum MATLAB
    Réponses: 0
    Dernier message: 12/08/2008, 16h42

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