Problème créer une fonction sinus
Dhumbledore
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
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,
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:
- Problème créer une fonction sinus
- Fonction si et - Guide
- Comment créer un groupe whatsapp - Guide
- Créer un compte google - Guide
- Créer une adresse hotmail - Guide
- Créer un lien pour partager des photos - Guide
1 réponse
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
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