From: Marco Costalba Date: Sat, 10 Aug 2013 15:11:13 +0000 (+0200) Subject: Fix GrainSize rounding error X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=94a3608ab9f2334784ac3b111dc79c9eb5e33ba3;p=fairystockfish.git Fix GrainSize rounding error The rounding formula is different between positive and negative scores due to the GrainSize/2 term that is asymmetric. So use truncation instead of rounding. This guarantees that evaluation is rounded to zero in the same way for both positive and negative scores. Found with position's flip bench: 4634244 --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 25ee79e..147a1b3 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -1083,7 +1083,7 @@ Value do_evaluate(const Position& pos, Value& margin) { int ev = (eg_value(v) * int(sf)) / SCALE_FACTOR_NORMAL; int result = (mg_value(v) * int(ph) + ev * int(128 - ph)) / 128; - return Value((result + GrainSize / 2) & ~(GrainSize - 1)); + return Value((result / GrainSize) * GrainSize); // Sign independent } // apply_weight() weights score v by score w trying to prevent overflow