Truncating all your x,y floats towards 0 when rendering is enough to ensure you never get cracking, though Stonemonkey is bang on to say that that's not perfect - it's very good though. There's no need to perspective correct your r,g,b imho, there's enough error in the fact your using Gouraud and the RGB colour-space to make it irrelevant, just perspective correct the u,v, which is really important.
Jim
I'm of a slightly different opinion with regards to perspective correct rgb/shading, if it's on a textured surface then it's not really noticable but if the surface is a single colour then it can be. As you already have 1/(1/z) to get u and v then it's only an extra mul for each extra component in the inner loop.
For the first time in a while I've been looking at some code, as usual this is some cubes. With perspective correct shading and more accurate normal calculation than just averaging. Even though it's not textured I think the visible banding in the shading is due to the bi linear filtering and the shading calcs being combined. The bend in the shading is still a little noticable at some extreme angles but not noo bad.
L/R mouse buttons turn, both together move forward.