Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: ELO Formula/Table

Author: Dann Corbit

Date: 13:35:57 10/13/99

Go up one level in this thread


Here is my interpretation of the USCF rules for ELO calculation:

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

double
provisional_rating (
		     double opponent_average_rating,
		     unsigned wins,
		     unsigned draws,
		     unsigned losses
)
{
  double new_rating;
  if (wins + draws + losses == 0)
    new_rating = 0.;
  else
    new_rating = opponent_average_rating +
      (400.0 * ((wins + 0.5 * draws) - (0.5 * draws + losses)) /
       (wins + draws + losses));
  return (double) (unsigned) (new_rating + 0.5);
}
double
established_rating (
		     double old_rating,
		     double event_score,
		     double rating_difference,
		     char half_k_event,
		     double prize_amount,
		     unsigned event_level
)
{
  double rating;
  double k = old_rating >= 2400.0 ? 16.0 : old_rating >= 2100.0 ? 24.0 : 32.0;
  if (half_k_event)
    k *= 0.5;
  rating = old_rating + k * (event_score - win_expectancy (rating_difference));
  if (old_rating <= 2099.0 &&
      rating >= 2100.0 &&
      rating <= 2399.0)
    rating = 2100.0 + (rating - 2100.0) * 0.75;
  else if (old_rating >= 2100.0 &&
	   old_rating <= 2399.0 &&
	   rating <= 2099.0)
    rating = 2100.0 * (rating - 2100.0) * 1.33;
  else if (old_rating >= 2100.0 &&
	   old_rating <= 2399.0 &&
	   rating >= 2400.0 &&
	   rating <= 3000.0)
    rating = 2400.0 * (rating - 2400.0) * 0.66;
  else if (old_rating >= 2400.0 &&
	   old_rating <= 3000.0 &&
	   rating >= 2100.0 &&
	   rating <= 2399.0)
    rating = 2400.0 * (rating - 2400.0) * 1.50;
  return rating_floor_adj (old_rating, rating, prize_amount, event_level);
}
double
win_expectancy (
		 double rating_difference
)
{
  return 1.0 / (pow (10.0, (rating_difference / 400.0)) + 1.);
}
double
rating_floor_adj (
		   double old_rating,
		   double new_rating,
		   double prize_amount,
		   unsigned event_level
)
{
  char large_cash_prize = 0;
  double temp_floor = old_rating - 200.0;
  unsigned ltf = ((unsigned) (temp_floor)) % 100UL * 100UL;
  if (old_rating >= 2400 || old_rating <= 100)
    return new_rating;
  if (old_rating < 1600)
    ltf = 100;
  if (old_rating < 2200 && prize_amount >= 1000)
    large_cash_prize = 1;
  else if (old_rating < 2300 && prize_amount >= 1500)
    large_cash_prize = 1;
  else if (old_rating < 2400 && prize_amount >= 2000)
    large_cash_prize = 1;
  if (large_cash_prize)
    ltf = event_level;
  return ltf > new_rating ? (double) ltf : new_rating;
}
unsigned long
rating_floor (
	       double old_rating,
	       double new_rating,
	       double prize_amount,
	       unsigned event_level
)
{
  char large_cash_prize = 0;
  unsigned floor_value = (((unsigned) (old_rating - 200)) % 100U) * 100U;
  if (old_rating >= 2400 || old_rating <= 100)
    return (unsigned long) (new_rating + 0.5);
  if (old_rating < 1600)
    floor_value = 100;
  if (old_rating < 2200 && prize_amount >= 1000)
    large_cash_prize = 1;
  else if (old_rating < 2300 && prize_amount >= 1500)
    large_cash_prize = 1;
  else if (old_rating < 2400 && prize_amount >= 2000)
    large_cash_prize = 1;
  if (large_cash_prize)
    floor_value = event_level;
  return floor_value;
}
const char *
describe_uscf_rating (
		       unsigned rating
)
{
  char *rating_name;
  if (rating > 2399)
    rating_name = "Senior Master";
  else if (rating >= 2200)
    rating_name = "Master";
  else if (rating >= 2000)
    rating_name = "Expert";
  else if (rating >= 1800)
    rating_name = "Class A";
  else if (rating >= 1600)
    rating_name = "Class B";
  else if (rating >= 1400)
    rating_name = "Class C";
  else if (rating >= 1200)
    rating_name = "Class D";
  else if (rating >= 1000)
    rating_name = "Class E";
  else if (rating >= 800)
    rating_name = "Class F";
  else if (rating >= 600)
    rating_name = "Class G";
  else if (rating >= 400)
    rating_name = "Class H";
  else if (rating >= 200)
    rating_name = "Class I";
  else
    rating_name = "Class J";
  return rating_name;
}
int
main (void)
{
  double rating_difference;
  double ameteur = 1351.;
  for (rating_difference = 0; rating_difference <= 3000; rating_difference +=
100)
    {
      printf ("Win expectency for a difference of %.0f points is %g\n",
rating_difference,
	      win_expectancy (rating_difference));
    }
  printf ("%.15g\n", win_expectancy (1800. - 1351.) *
	  win_expectancy (2004. - 1351.) *
	  win_expectancy (1938. - 1351.) *
	  win_expectancy (1786. - 1351.));
  printf ("%.15g\n", win_expectancy (1800. - 1351.));
  printf ("%.15g\n", win_expectancy (2004. - 1351.));
  printf ("%.15g\n", win_expectancy (1938. - 1351.));
  printf ("%.15g\n", win_expectancy (1786. - 1351.));
  printf ("%.15g\n", win_expectancy (2500. - 2260.));
  printf ("%.15g\n", win_expectancy (2200. - 1700.));

  return 0;
}



This page took 0 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.