Problème créer une fonction sinus

Fermé
Dhumbledore Messages postés 1 Date d'inscription lundi 1 avril 2013 Statut Membre Dernière intervention 1 avril 2013 - 1 avril 2013 à 17:16
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 1 avril 2013 à 17:40
Bonsoir,
Dans le cadre de travaux pratiques à l'école, je dois résoudre la question suivante:
Demander à l'utilisateur de rentrer deux nombres a et b ainsi que l'ordre k. Puis calculer les sinus de tous les nombres entre a et b avec un pas de 0.1 ( si par x a=6,b=7 on va calculer sinus(6);sin(6.1);(sin6.2)...sin(7) ) et ce, en utilisant le développement limité de sinus au voisinage de zéro.
Pour ce j'ai fais deux fonctions: une pour calculer le factorielle (car on en a besoin dans le DL de sinus au voisinage de 0) et une autre pour calculer le DL du sinus. Mais à la compilation le programme me donne une boucle infinie. Veuillez m'aider sil vous plait.
cordialement,
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double factorielle(double nombre);
double sinus (double x, int k);

int main()
{
    int k;
    double total=1,a,b,i,p;

    printf("entrer a et b\n");
    scanf("%f%f",&a,&b);
    printf("k=?");
    scanf("%d",&k);

    for (i=a;i<b;i+=0.1)
    {
       printf("sinus (%.2lf) a %d pres = %.2lf \n",i,k,sinus(i,k));
       printf("Avec Math.h sinus (%.2lf) a %d pres = %.2lf \n",i,k,sin(i));
    }

    return 0;
}


double factorielle(double nombre)
{
double result, i;
 if((nombre)==0)
            result=1;
 else
    {
        result=nombre;
        for(i=1; (nombre-i)>1; i++)
        {
            result*=(nombre-i);
        }
    }
return result;
}
double sinus (double x, int k)
{
    double sinus=0,i;
    for(i=0;i<=k; i++)
    {
        int c,d;
        c=(pow(-1,i));
        d=(pow(x,2*i + 1));

        sinus+=(float)(c*d)/factorielle(2*i + 1);
    }
    return sinus;
}
A voir également:

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 1/04/2013 à 17:41
Plein de choses à dire :

scanf("%f%f",&a,&b);
a et b sont de type double, donc %lf dans le scanf. Et n'oublie pas l'espace entre les deux.
Ce qui donne : scanf("%lf %f",&a, &b);

if((nombre)==0)
On ne compare pas comme ça un nombre double. Il faut vérifier que la différence est suffisamment petite (inférieur à EPSILON).

Votre fonction "factorielle" est correcte mais peut être simplifiée.

double sinus=0,i;
Là, tu déclares i en tant que double. Il faut qu'il soit de type entier (par exemple : int), ce n'est pas qu'une question de goût mais aussi de précision. D'une manière générale, il vaut mieux éviter de tout déclarer sur une ligne. Une ligne par idée (là c'est une question de style).

sinus+=(float)(c*d)/factorielle(2*i + 1);
Pourquoi caster en un double en float ??? Enlève ce cast, ça sera mieux.

printf("sinus (%.2lf) a %d pres = %.2lf \n",i,k,sinus(i,k));
Dans les printf, c'est %f qu'il faut mettre. Donc %.2f, etc.

Courage :-)

Cdlt,

Google is your friend
0