I think software can account for some of the error. I developed this on a 90:1 table with 18,000 steps per rev. I think your table is 1200 steps per rev.
The base unit I use is seconds of a degree so there are 1,296,000 of them in a circle. Angles are entered as degrees, minutes and seconds but internally, it is converted and stored as the number of seconds. Integer maths is used for the conversion so there is no risk of rounding errors. A division on the other hand is converted to an angle (in seconds) so there is an additional mathematical step.
In either case, the angle in seconds (gAngle in the code) is sent to goDivide where it is used to calculate the number of steps per division in this code:
Code:
stepsPerDiv = (long)(tmpSTEPS_PER_REV *((float)gAngle/(float)MINUTES_IN_CIRCLE));
divisions = (long)((float) MINUTES_IN_CIRCLE / (float) gAngle);
When I looked at your example for 36 divisions, I made you were moving 200 x 6 = 1200 steps per rev. which is 33.3333 steps per division. The code drops the 0.33 and give you 33.0 steps per division. So by the end of the exercise, 36 x 0.3333 = 12 stepper steps of error per revolution.
12/1200 * 360 = 3.6 degrees
so your last division should be at 356.4 degrees
So I'll take this as a bug!
What I should be doing is to accumulate the 0.3333 error and when it is >= 1.0, add one step to the number of divisions. The subtract 1 from the error so any residual error is carried forward for the next one. This would mean that every third division, I would add 1 step to that division so the missing 12 steps were spread around so they were never noticed.
I'll see if I can post an updated goDivide() procedure for you to test in the next day or so