Petit problème en C
Résolu/Fermé2 réponses
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
12 juin 2011 à 21:36
12 juin 2011 à 21:36
i est un entier, donc (2*i)/((2*i)+1) est calculé comme un entier. Ici 2/3=0
Ce n'est qu'une fois calculé qu'on donne la valeur 0 à b.
Pour que ça marche, tu dois caster le calcul en type flottant :
Ce n'est qu'une fois calculé qu'on donne la valeur 0 à b.
Pour que ça marche, tu dois caster le calcul en type flottant :
double b = (double) (2*i)/(2*i+1);
Merci de m'avoir répondu j'ai remplacé int i par double i et mon programme d'arc tangente fonctionne sauf le calcul de PI...^^
#include <iostream>
using namespace std;
double eps=10e-8;
double arctg (double x)
{
double i=1;
double result=1,terme1=1,terme2=1,terme3=1,a=(x*x)/(1+(x*x)),b;
do
{
b=(2*i)/((2*i)+1);
terme2=b*terme2;
terme1=a*terme1;
terme3=terme1*terme2;
result=result+terme3;
i++;
}while(terme3>=eps);
result=result*(a/x);
return result;
}
int main()
{
double x;
cin>> x;
cout<<arctg(x)<<endl;
cout<<"Pi "<< 4*((4*arctg(1/5))-(arctg(1/239)))<<endl;
return 0;
}
#include <iostream>
using namespace std;
double eps=10e-8;
double arctg (double x)
{
double i=1;
double result=1,terme1=1,terme2=1,terme3=1,a=(x*x)/(1+(x*x)),b;
do
{
b=(2*i)/((2*i)+1);
terme2=b*terme2;
terme1=a*terme1;
terme3=terme1*terme2;
result=result+terme3;
i++;
}while(terme3>=eps);
result=result*(a/x);
return result;
}
int main()
{
double x;
cin>> x;
cout<<arctg(x)<<endl;
cout<<"Pi "<< 4*((4*arctg(1/5))-(arctg(1/239)))<<endl;
return 0;
}
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
12 juin 2011 à 21:51
12 juin 2011 à 21:51
"i++" sur un double ? je ne dit pas que c'est faux, mais j'ai un gros doute.
i+=1. et tu seras sur.
Sinon, pi c'est 4*arctg(1.)
i+=1. et tu seras sur.
Sinon, pi c'est 4*arctg(1.)
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
12 juin 2011 à 21:52
12 juin 2011 à 21:52
Et puis c'est quoi ta méthode de calcul ?
Pour des développements limités tu devrais avoir une alternance de signe :
Arctan (x) = x - x^3/3 + ... + (-1)^n x^(2n+1)/(2n+1) + o(x2n+1)
Pour des développements limités tu devrais avoir une alternance de signe :
Arctan (x) = x - x^3/3 + ... + (-1)^n x^(2n+1)/(2n+1) + o(x2n+1)
KX
Messages postés
16753
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 019
12 juin 2011 à 22:15
12 juin 2011 à 22:15
Si tu prends x=1 par exemple, x²/(1+x²)^i =1/2^i or la somme infinie des 1/2^i = 1 ou 2 selon si tu commences tes indices i à 0 ou 1... Donc arctan(1)=0.5 ou 1 !!!
Vérifies ta formule, même si c'est une approximation tu as visiblement un problème...
Vérifies ta formule, même si c'est une approximation tu as visiblement un problème...
12 juin 2011 à 21:41
je tenterai plutôt : qui fait une transformation implicite de int vers double.