Rechercher : dans
Par :

Cosinus sans maths.h en langage C

Dernière réponse le 13 nov 2008 à 18:54:36 Jean_B, le 11 nov 2008 à 19:47:09 
 Signaler ce message aux modérateurs

Bonjour,
j'apprend le langage c et je voudrais savoir comment fair un programme qui calcul cosinus(x)
grace aux programmes secondaires factorielle et puissance avec cette formule :

cos(x)= 1-x²/2! + x^4/4! - x^6/6!...
ou encor avec mes fonctions secondaires :

cos(x) = 1- puiss(x,2)/fact(2)+puiss(x,4)/fact(4)-puiss(x,6)/fact6...

avec puiss(x,y)= x^y

j'ai vraiment plus d'idées..

merci d'avance

Configuration: Linux
Firefox 3.0.3

Meilleures réponses pour « Cosinus sans maths.h en langage C » dans :
Les files en langage C VoirLes files - Premier Entré Premier Sorti Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la file IV. Opérations sur les files A. Initialisation B. Insertion d'un élément dans la file C. Oter un...
Caractéristiques du langage C VoirLe fichier source Le fichier source d'un programme écrit en langage C est un simple fichier texte dont l'extension est par convention .c. Note d'un visiteur (J.Grondin) : L'extension est en minuscules. Le .C (majuscule) est interprété par...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les types de données VoirLes types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...

1

Marco la baraque, le 11 nov 2008 à 23:59:01

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):

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, rtfm and jfgi

Répondre à Marco la baraque

2

Jean_B, le 12 nov 2008 à 00:13:31

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;
}

Répondre à Jean_B

3

Jean_B, le 12 nov 2008 à 00:16:07

ErrFactorielle et errPuissance c'étai quelque chose qu'on nous a di de mettre pour voir les limites

Répondre à Jean_B

4

Jean_B, le 12 nov 2008 à 00:17:54
  • +1

Avec le "cos" de la fin en "sin" bien sur ^'

Répondre à Jean_B

5

Marco la baraque, le 12 nov 2008 à 00:30:02

Rebonsoir,
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, rtfm and jfgi

Répondre à Marco la baraque

6

Jean_B, le 12 nov 2008 à 00:44:56

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

Répondre à Jean_B

7

Marco la baraque, le 12 nov 2008 à 01:04:36

Pour l'erreur, apparemment en C99 il ne faut pas déclarer i à l'intérieur du for :
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, rtfm and jfgi

Répondre à Marco la baraque

8

Jean_B, le 12 nov 2008 à 01:10:33

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

Répondre à Jean_B

9

Jean_B, le 12 nov 2008 à 18:37:53
  • +1

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

Répondre à Jean_B

10

Marco la baraque, le 12 nov 2008 à 19:45:19

Eh bien, même pas le temps d'y réfléchir à nouveau... Passe le statut à "Résolu" si c'est ok.

De rien et à bientôt sur le forum.
Cordialement, rtfm and jfgi

Répondre à Marco la baraque

11

Jean_B, le 12 nov 2008 à 19:53:07

Ok c fait^^

Répondre à Jean_B

12

 yann, le 13 nov 2008 à 18:54:36

Ui voilà dc jai lu ce ke vs avez fait et ça ma bien servi pr tt à lheure puiske jai pas eu à trop réfléchir.
je voulais savoir si vs connaissiez le logiciel ke lon peut télécharger pr faire des programmes sur windows?
merci

Répondre à yann