Author: Odd Gunnar Malin
Date: 14:35:40 04/19/05
Go up one level in this thread
On April 19, 2005 at 16:07:33, Dieter Buerssner wrote:
>On April 19, 2005 at 03:27:48, Odd Gunnar Malin wrote:
>
>> // Alghorithm from Simon Schmitt's site on the net.
>>
>> // Die offiziellen Elo-Zahlen werden nach folgender Formel errechnet:
>> // Erwartung = 0,5 + 1,4217 x 10^-3 x D
>> // - 2,4336 x 10^-7 x D x |D|
>> // - 2,5140 x 10^-9 x D x |D|^2
>> // + 1,9910 x 10^-12 x D x |D|^3
>>
>> // wobei gilt:
>> // D = Differenz = Elo(eigene, alt) - Elo(Gegner, alt)
>> // |D| = Absolutbetrag von D
>
>Interesting. I tried to reproduce the tables given by FIDE and the German chess
>federation, and got very close results to the numbers given. However in the
>tails, the error was larger than just a rounding error. I had tried formulas
>based on the logistic distribution (they were given earlier in this thread,
>too), and based on normal distribution. Both ´formulas give very similar
>numbers, unless in the extreme tails of the distribution. The numbers listed in
>the tables were somewhere in between ...
>
>Above formula looks like the author had a pocket calculator without scientific
>functions, and neither had a logarithmic table book, nor a (good) slide rule :-)
>
>Well, above formula can be calculated with a pen only in reasonable time. It may
>also be the case, that he really wanted the normal distribution. The formula for
>the score uses the error function erf() then, which really will not be on a
>slide rule. I think it could not easily be inverted for calculation of D.
>
>Regards,
>Dieter
You are probably right, what I eventually will end up with is a handcalculated
table. But this approx is closer to what you see used at Twic etc. than using
the log10 approx.
Here is how I do it now (in real it is in a c++ class):
int expectedscore[757];
void init()
{
// Initialise the expectedscore table
// This table gives elodifferance from score/game points 0.500 to 0.999
// where ratigndiff at 0 are put in cell 0, ratingdif at 1 are put in cell 1
etc.
// Only positive elo diferances are put in the table.
// Alghorithm from Simon Schmitt's site on the net.
// http://www.terminus-notfallmedizin.de/privat/daselosystem.html
// Die offiziellen Elo-Zahlen werden nach folgender Formel errechnet:
// Erwartung = 0,5 + 1,4217 x 10^-3 x D
// - 2,4336 x 10^-7 x D x |D|
// - 2,5140 x 10^-9 x D x |D|^2
// + 1,9910 x 10^-12 x D x |D|^3
// wobei gilt:
// D = Differenz = Elo(eigene, alt) - Elo(Gegner, alt)
// |D| = Absolutbetrag von D
int diff;
long double score;
long double c1,c2,c3,c4;
c1=0.0014217;
c2=0.00000024336;
c3=0.0000000025140;
c4=0.0000000000019910;
expectedscore[0]=500;
for (diff=1;diff<757;diff++)
{
score=0.5;
score+=c1*diff;
score-=c2*diff*diff;
score-=c3*diff*diff*diff;
score+=c4*diff*diff*diff*diff;
expectedscore[diff]=(int)(score*1000+0.5);
}
};
// To get the actual performance use:
// perf=average+ratingdiff
int getRatingDifferance(double score)
{
bool negative=false;
if (score<0.5)
{
score=1.0-score;
negative=true;
}
int nscore=(int)((score+0.0005)*1000);
int diff;
for (diff=0;diff<757;diff++)
{
if (nscore<=expectedscore[diff])
break;
}
if (negative)
diff*=-1;
return diff;
}
// ratingdiff=your rating - average rating
double getExpectedScore(int ratingdiff)
{
bool negative=false;
if (ratingdiff<0)
{
ratingdiff*=-1;
negative=true;
}
double score=1.0;
if (ratingdiff<757)
score=(double)expectedscore[ratingdiff]/1000;
if (negative)
score=1.0-score;
return score;
}
As you see I use a table lookup to get both expected score and performance
difference. It is only a table of 757 entries so it's easy to create it by hand
and put it in a header file. I would probably do this when I get time.
Odd Gunnar
This page took 0.01 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.