2016-11-18 3 views
0
double taylor_log(double x, unsigned int n){ 
double tmp; 
double sum = 0; 
if(x < 1){ 
    int j = 2; 
    x = 1 - x; 
    tmp = x; 
    sum = -x; 
    for(unsigned int i = 1; i < n; i++){ 
     sum -= ((tmp *= x)/j); 
     j++; 
    } 
    return sum; 
} 
else if (x >= 1){ 
    tmp = ((x-1)/x); 
    for(unsigned int i = 1; i <= n; i++){ 
     sum += (tmp/i); 
     tmp *= ((x-1)/x); 
    } 
    return sum; 

Ceci est ma fonction pour les séries de taylor qui fonctionnent correctement. Im en utilisant cette formule pour obtenir une réduction exponetional du nombre. formula for mypow() ce qui est mon code pour powmypow() cuvette continue fraction et taylorseries retourne un nombre plus grand que pow()

double taylor_pow(double x, double y, unsigned int n){ 
double sum = 1.0; 
int fac = 1; 
double exp = y; 
double lna = taylor_log(x, n); 
for(unsigned int i = 1; i <= n; i++){ 
    fac *= i; 
    sum += (exp * lna/fac); 
    exp *= y; 
    lna *= taylor_log(x, n); 
} 
return sum; 

} Maintenant, mon problème est que si je mets par exemple 30 itérations pour ma fonction le nombre est supérieur à pow(). Par exemple pow (2,3) = 8 et mon résultat avec 20 itérations est 8.0007 ... et sa croissance. Thans pour toutes les réponses.

+0

S'il augmente: cela ressemble beaucoup à un problème d'arrondi cumulatif: les résultats des calculs intermédiaires ne correspondent pas exactement à leur variable temporaire. Vous avez simplement des limites de précision, et je suspecte que les erreurs s'accumulent puisque vous ajoutez et multipliez la plupart du temps (expérience: quel est le résultat quand 'x = 0.5' en entrée, où' tailor_log' vous donne des résultats négatifs?) . Si c'est le cas, vous devrez trouver des moyens intelligents (reformulations) pour éviter ces erreurs d'arrondi. – Evert

Répondre

0

int fac déborde. Changé à long double, et cela fonctionne beaucoup mieux. Un entier signé à 32 bits ne peut contenir que des valeurs allant jusqu'à 12 !, tandis qu'un double à 80 ou 128 bits peut contenir quelque chose comme 2000 !.

+0

128 bits nombre flottant sont très rares! et long double est le comportement du compilateur. – Stargateur

+0

@Stargateur Oui, c'est vrai, mais 64 bits devraient être plus que suffisants pour obtenir une valeur acceptable pour 2^3, et 80 bits encore plus. –