We have just had this on another post under a different guise.
The problem, I think, is to do with tool width compensation.
If you think about it, on tool width compensation the tool has a "shield" all around it - equal to the tool width radius. It has to be all way round, because unless the tool knows exactly which part of the tool is in contact with the work, it does not know in which direction to apply the compensation.
If you start at the centre of a circle (0,0) say of 1 inch diameter with a 0.25 bit, then the bit will travel out to (0.875,0) to start. There will be no compensation on the Y movement - because there is no movement on that axis.
If you then describe the circle, both axis are moving, therefore both will be compensated.
When you get right round and are approaching position (1,0) again the cutter will actually stop at (0.875,0125) - short of (0,0) on both axis (actually slightly less than 0.875 on the X) but you get the idea.
Depending on how the code is written, either the cutter will pull out and go back to centre, then repeat - with the same effect, or the cutter will take another pass, and overcut the part it had missed, but somewhere you will be able to see it.
How do you get round it - it depends - if there is no material in front of the cutter, you can move the cutter the extra 1/8" or whatever. I have not tried turning off the cutter compensation - and moving to (1,0) so whilst this would correct the Y axis shortfall, I am not sure of the effect on the X axis.
The complete answer is to program the G2 or G3, without cutter compensation on.
That is the theory from observations I made when cutting some (largish) windows with rounded corners with a large routing tool - it would never get right round. I had to compensate by starting halfway down a straight side and over-running on completion.