Why doesn't SimpleEval's eval change in multiples of 1? SimpleEval is Stockfish with simple eval - it only counts the material in the position and ignores all other evaluation factors like king safety or mobility. It is currently playing at TCEC.
If SimpleEval only counts material, how is it possible that it occasionally shows fractional eval? As I understand chess engines, they search the game tree and return the eval function on the final position of the search tree. Since SimpleEval only counts material, its eval ought to change in steps of 1. Yet on move 42 of this game, it shows an eval of -4.25. There's no material combination that could possibly yield that eval. What's going on?
I took a peek at the code given in a comment. It seems to have a small semi-random factor added to the evaluation, probably so it can more easily just pick a move from all the ties that are going to come up. However, the size of the score difference appears to be greater than what could be explained by just this. Also, at move 65 it evaluates the position as -M3 but there is clearly not a mate in 3 from that position.
The false mate clearly shows that there is a bug somewhere.