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.