2013-06-12 3 views
-1

J'ai un problème avec la fonction pow dans c. La variable Qb donnera une mauvaise sortie - elle donne 10000 au lieu de 177827.941004 résultant en la sortie finale de 2007 au lieu de 2009la fonction pow en C ne reconnaît pas la variable

La commande de compilation est par. gcc -ggdb -std=c99 -Wall -Werror -o test_pow02 test_pow02.c -lm

#include <stdio.h> 
#include <math.h> 

int main(int argc, char **argv) 
{ 
    int my_rating = 2000; 
    int opponent_rating = 2100; 
    int coeff = 15; 
    int score = 1; 
    int new_rating; 

    double Qa = pow(10, my_rating/400); // 100000 
    double Qb = pow(10, opponent_rating/400); // 177827.941004 

    double Ea = Qa/(Qa + Qb); 

    new_rating = my_rating + ((score - Ea) * coeff); 

    printf("Qa is %g\n", Qa); 
    printf("Qb is %g\n", Qb); 
    printf("New Rating is %d\n", new_rating); 

    return 0; 
} 

Mais si je Hardcoded 2100/400 en 5.25, il fonctionnera correctement. J'ai déjà -lm à la fin. Comment puis-je réparer ça?

#include <stdio.h> 
#include <math.h> 

int main(int argc, char **argv) 
{ 
    int my_rating = 2000; 
    //int opponent_rating = 2100; 
    int coeff = 15; 
    int score = 1; 
    int new_rating; 

    double Qa = pow(10, my_rating/400); // 100000 
    double Qb = pow(10, 5.25); // 177827.941004 

    double Ea = Qa/(Qa + Qb); 

    new_rating = my_rating + ((score - Ea) * coeff); 

    printf("Qa is %g\n", Qa); 
    printf("Qb is %g\n", Qb); 
    printf("New Rating is %d\n", new_rating); 

    return 0; 
} 

Répondre

3

L'opération pow(10, opponent_rating/400); ne est pas égal à 177827.941004.

opponent_rating/400 == 5  

opérations impliquant deux entiers produira un entier,
dans ce cas le résultat 5.25 se clipser à 5

Vous devez partager avec un double pour obtenir un double résultat opponent_rating/400.0 qui est utilisé dans la fonction pow .

+0

Je supprimer le suffixe 'f'. 'pow' va quand même travailler avec des doubles donc il n'y a pas de raison de descendre à la précision 'float'. –

Questions connexes