Cosinus sans maths.h en langage C
Résolu/Fermé
A voir également:
- Cos en c
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Delphi (langage) - Télécharger - Langages
9 réponses
c'est bon j'ai réussi j'ai changé la maniere de précision et sa fonctionne :
float Cosinus(float x){
float E = 0.001;
int c=1;
int n=-2;
float cos = 0;
do {
cos = c * (Puissance(x,2+n)/Factorielle(2+n)) +cos;
c=-1*c;
n=n+2;
}while ((Puissance(x,n+1) / Factorielle(n+1)) >= E);
return cos;}
Merci pour ton aide Marco la baraque
float Cosinus(float x){
float E = 0.001;
int c=1;
int n=-2;
float cos = 0;
do {
cos = c * (Puissance(x,2+n)/Factorielle(2+n)) +cos;
c=-1*c;
n=n+2;
}while ((Puissance(x,n+1) / Factorielle(n+1)) >= E);
return cos;}
Merci pour ton aide Marco la baraque
merci
en fait j'avais déjà fait les fonctions factorielle et puissance
le probleme c'est que je ne sais pa quoi mettre dans la boucle de la fonction cosinus...
j'ai mi :
#include<stdio.h>
#include<values.h>
int i = 1;
float c=1;
int errPuissance = 0;
float Puissance(float a, float b){
if ((a!=0) && (b>0)){
do{
c=c*a;
i = i+1;}while(i<=b);
if (c<= MAXFLOAT){
errPuissance = 0;}
else{
errPuissance = -2;}}
else if((a!=0)&&(b<0)){
do{
c = c*(1/a);
i=i+1;}while(i<=(-b));}
else if(b==0){
c=1;}
else{
errPuissance =-1;}
return c;
}
//////////////////////////////////////////////////////////////////
int errFactorielle = 0;
float Factorielle(int n){
float fact =1;
int i=1;
if(n<0){
errFactorielle =-1;}
else{
if(n==0){
fact = 1;}
else{
do {
fact = fact*i;
i = i+1;}while(i<=n);
if (fact <= MAXFLOAT){
errFactorielle = 0;}
else{
errFactorielle = -2;}
}
}
return fact ;
}
float Cosinus(float x){
float Pi = 3.141592654;
int n = 0;int i= 0;
int c =1;
float cos;
if (x<0){
do{
x=x+2*Pi;}while (x<=(-2*Pi));return x;}
else{
do{
x=x-2*Pi;}while (x>=2*Pi);return x;}
do{
cos = 1+ c * (Puissance(x,n+2)/Factorielle(n+2));
c = -1*c;i=i+1;
n = n+2;}while(i<= 100);
return cos;
}
float Sinus(float x){
int n = -1; int i =0;
int c = 1;
float sin;
float Pi = 3.141592654;
if (x<0){
do{
x=x+2*Pi;}while (x<=-2*Pi);}
else{
do{
x=x-2*Pi;}while (x>=2*Pi);}
do{
sin =c * (Puissance(x,n+2)/Factorielle(n+2));
c = -1*c;i=i+1;
n = n+2;}while(i<= 100);
return sin ;
}
int main(){
float x,cos,sin;
printf("Donnez la valeur de x\n");
scanf("%f", &x);
cos = Cosinus(x);
sin = Sinus(x);
printf("La valeur de cos(%f) = %f\n",x ,cos);
printf("La valeur de sin(%f) = %f\n",x,cos);
return 0;
}
en fait j'avais déjà fait les fonctions factorielle et puissance
le probleme c'est que je ne sais pa quoi mettre dans la boucle de la fonction cosinus...
j'ai mi :
#include<stdio.h>
#include<values.h>
int i = 1;
float c=1;
int errPuissance = 0;
float Puissance(float a, float b){
if ((a!=0) && (b>0)){
do{
c=c*a;
i = i+1;}while(i<=b);
if (c<= MAXFLOAT){
errPuissance = 0;}
else{
errPuissance = -2;}}
else if((a!=0)&&(b<0)){
do{
c = c*(1/a);
i=i+1;}while(i<=(-b));}
else if(b==0){
c=1;}
else{
errPuissance =-1;}
return c;
}
//////////////////////////////////////////////////////////////////
int errFactorielle = 0;
float Factorielle(int n){
float fact =1;
int i=1;
if(n<0){
errFactorielle =-1;}
else{
if(n==0){
fact = 1;}
else{
do {
fact = fact*i;
i = i+1;}while(i<=n);
if (fact <= MAXFLOAT){
errFactorielle = 0;}
else{
errFactorielle = -2;}
}
}
return fact ;
}
float Cosinus(float x){
float Pi = 3.141592654;
int n = 0;int i= 0;
int c =1;
float cos;
if (x<0){
do{
x=x+2*Pi;}while (x<=(-2*Pi));return x;}
else{
do{
x=x-2*Pi;}while (x>=2*Pi);return x;}
do{
cos = 1+ c * (Puissance(x,n+2)/Factorielle(n+2));
c = -1*c;i=i+1;
n = n+2;}while(i<= 100);
return cos;
}
float Sinus(float x){
int n = -1; int i =0;
int c = 1;
float sin;
float Pi = 3.141592654;
if (x<0){
do{
x=x+2*Pi;}while (x<=-2*Pi);}
else{
do{
x=x-2*Pi;}while (x>=2*Pi);}
do{
sin =c * (Puissance(x,n+2)/Factorielle(n+2));
c = -1*c;i=i+1;
n = n+2;}while(i<= 100);
return sin ;
}
int main(){
float x,cos,sin;
printf("Donnez la valeur de x\n");
scanf("%f", &x);
cos = Cosinus(x);
sin = Sinus(x);
printf("La valeur de cos(%f) = %f\n",x ,cos);
printf("La valeur de sin(%f) = %f\n",x,cos);
return 0;
}
rere bonsoir,
j'ai essayé avec :
float Cosinus(float x){
int ordre = 100;
float cos = 0;
for (int i = 0; i < ordre; i++) {
cos = cos + Puissance(-1, i) * Puissance(x, 2 * i) / Factorielle(2 * i);
}
return cos;}
mais il me met "erreur: «for» loop initial declaration used outside C99 mode"
en essayant avec do /while j'ai un résultat mais c'est cos(Pi) = nan
si je baisse l'ordre a 10 j'ai cos(Pi)= 4.371524
j'ai essayé avec :
float Cosinus(float x){
int ordre = 100;
float cos = 0;
for (int i = 0; i < ordre; i++) {
cos = cos + Puissance(-1, i) * Puissance(x, 2 * i) / Factorielle(2 * i);
}
return cos;}
mais il me met "erreur: «for» loop initial declaration used outside C99 mode"
en essayant avec do /while j'ai un résultat mais c'est cos(Pi) = nan
si je baisse l'ordre a 10 j'ai cos(Pi)= 4.371524
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
12 nov. 2008 à 01:04
12 nov. 2008 à 01:04
Pour l'erreur, apparemment en C99 il ne faut pas déclarer i à l'intérieur du for :
Essaie ça :
En principe, déjà à l'ordre 10 on devrait avoir une bonne approximation, donc ce n'est pas normal.
Le problème vient peut-être de ma fonction, peut-être des fonctions qu'on utilise (tes fonctions puissance et factorielle sont-elles correctes ?).
En tout cas je testerai ça demain soir (là j'essaierai de compiler, d'exécuter et de tester le code avant de te l'envoyer comme ça).
Cordialement,
Essaie ça :
int i; for (i = 0; i < ordre; i++) { ...
En principe, déjà à l'ordre 10 on devrait avoir une bonne approximation, donc ce n'est pas normal.
Le problème vient peut-être de ma fonction, peut-être des fonctions qu'on utilise (tes fonctions puissance et factorielle sont-elles correctes ?).
En tout cas je testerai ça demain soir (là j'essaierai de compiler, d'exécuter et de tester le code avant de te l'envoyer comme ça).
Cordialement,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
11 nov. 2008 à 23:59
11 nov. 2008 à 23:59
Bonsoir Jean_B,
Ton approche est très bonne.
Ta fonction principale prendra 2 arguments :
- la valeur de x
- la précision du calcul (l'ordre de ton développement limité)
En principe le calcul est très simple : c'est une simple boucle qui va poursuivre le calcul tant que tu ne seras pas arrivé à l'ordre souhaité (passé en paramètre).
Tu as effectivement besoin d'implémenter les fonctions factorielle et puissance, mais ce n'est pas très compliqué. Voici les algorithmes (à toi de les traduire en C):
Cordialement,
Ton approche est très bonne.
Ta fonction principale prendra 2 arguments :
- la valeur de x
- la précision du calcul (l'ordre de ton développement limité)
En principe le calcul est très simple : c'est une simple boucle qui va poursuivre le calcul tant que tu ne seras pas arrivé à l'ordre souhaité (passé en paramètre).
Tu as effectivement besoin d'implémenter les fonctions factorielle et puissance, mais ce n'est pas très compliqué. Voici les algorithmes (à toi de les traduire en C):
fonction factorielle(entier n): entier entier i = 1 entier résultat = 1 tant que i <= n faire résultat = résultat * i i = i + 1 fin tant que retourner résultat //on n'a besoin que des puissances positives entières, ça simplifie l'algorithme fonction puissance(réel x, entier y) : réel entier itérateur = 1 réel résultat = 1 tant que itérateur <= y faire résultat = résultat * x itérateur = itérateur + 1 fin tant que retourner résultat
Cordialement,
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
12 nov. 2008 à 00:30
12 nov. 2008 à 00:30
Rebonsoir,
Moi je ferais quelque chose dans le genre :
Je ne pense pas qu'il soit nécessaire de restreindre l'intervalle à ]-2Pi, 2Pi[, le développement limité doit être valide quelque soit x (je n'ai pas fait de maths depuis un moment donc il est possible que je me trompe).
Cordialement,
Moi je ferais quelque chose dans le genre :
float Cosinus(float x){ float Pi = 3.141592654; int ordre = 100; //l'ordre que tu avais dans ton algorithme float cos = 0; for (int i = 0; i < ordre; i++) { cos = cos + Puissance(-1, i) * Puissance(x, 2 * i) / Factorielle(2 * i); } return cos;
Je ne pense pas qu'il soit nécessaire de restreindre l'intervalle à ]-2Pi, 2Pi[, le développement limité doit être valide quelque soit x (je n'ai pas fait de maths depuis un moment donc il est possible que je me trompe).
Cordialement,
ok merci c'était bien ça lérreur
maintenant je trouve la meme chose qu'avec do/while
je crois que mes fonction factorielle et puissance fonctionnent comme je les ai testé avan de les mettre...
on verra ça demain...c'est l'heure de dormir :)
bonne nuit
maintenant je trouve la meme chose qu'avec do/while
je crois que mes fonction factorielle et puissance fonctionnent comme je les ai testé avan de les mettre...
on verra ça demain...c'est l'heure de dormir :)
bonne nuit
ok c fait^^
12 nov. 2008 à 19:45
De rien et à bientôt sur le forum.
Cordialement,