-1

cのpow関数に問題があります。変数 Qb は間違った出力を与えます - 177827.941004 の代わりに 10000 を与えるので、最終出力は 2009 ではなく 2007 になります。

コンパイルコマンドは by. 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;
}

しかし、2100/400 を 5.25 にハードコードすると、正しく動作します。私はすでに最後に -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, 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;
}
4

1 に答える 1

3

操作pow(10, opponent_rating / 400);は と等しくありません177827.941004

opponent_rating / 400 == 5    

2 つの整数を含む操作は整数を生成します
。この場合、結果5.25は次のようにクリップされます。5

pow関数opponent_rating / 400.0で使用されるdouble の結果を得るには、double で除算する必要があります。

于 2013-06-12T14:57:28.233 に答える