What mostly worked for me was two simple things: splitting the big tasks and constantly evaluating evaluations. With more smaller evaluations negative and positive errors anihilate each other. With adjusting the evaluations you can reach the a point where you don't have errors on only one side.
A very good book on software estimation is: https://www.amazon.com/Software-Estimation-Demystifying-Deve...