Original Post
I tried to implement fixed point math in my triangle fragment drawer, but got very strange results... I already tried outputing the numbers to a text file, but still couldnt make sense of what I was doing wrong. This same routine works fine if I uncomment the old code back in and use regular floats. I don't think its overflow because after clipping, none of the values can exceed 1280 which is the max width of my screen, and 1280 * 65536 = 83886080 = 27 bits here is pictures of my app using float, and then using the fixed point math: FLOAT: 
FIXED:
Thanks for any help =)

FIXED:

void GEOM::RenderFragment(UINT16 &index, smlVERTEX4 &lefttop, smlVERTEX4 &righttop, smlVERTEX4 &leftbot, smlVERTEX4 &rightbot)
{
float lx = lefttop.pos.x;
float rx = righttop.pos.x;
float dy = leftbot.pos.y - lefttop.pos.y;
float ml = (leftbot.pos.x - lx) / dy;
float mr = (rightbot.pos.x - rx) / dy;
m_dy = _mm_set_ps1(dy);
l_uvws = _mm_setr_ps(lefttop.tex.u, lefttop.tex.v, lefttop.pos.w, lefttop.shade); //set to top left vert values
r_uvws = _mm_setr_ps(righttop.tex.u, righttop.tex.v, righttop.pos.w, righttop.shade); //set to top right vert values
l_duvws = _mm_setr_ps(leftbot.tex.u, leftbot.tex.v, leftbot.pos.w, leftbot.shade); //set to bot left vert values
r_duvws = _mm_setr_ps(rightbot.tex.u, rightbot.tex.v, rightbot.pos.w, rightbot.shade); //set to bot right vert values
l_duvws = _mm_sub_ps(l_duvws, l_uvws); //subtract to get d_uvws for left
r_duvws = _mm_sub_ps(r_duvws, r_uvws); //subtract to get d_uvws for right
l_duvws = _mm_div_ps(l_duvws, m_dy); // divide by change in y
r_duvws = _mm_div_ps(r_duvws, m_dy); // divide by change in y
textr = &textures[index];
widsub1 = short(textr->bm.bmWidth - 1);
hgtsub1 = short(textr->bm.bmHeight - 1);
//multiply by 65536, then cast to long to create the 16.16 fixed point number
long flx = (long)(lx * 65536.f); //left edge x
long frx = (long)(rx * 65536.f); //right edge x
long fml = (long)(ml * 65536.f); //left edge slope
long fmr = (long)(mr * 65536.f); //right edge slope
for(sy = short(lefttop.pos.y); sy < short(leftbot.pos.y); sy++)
{
h_uvws = l_uvws;
h_duvws = _mm_sub_ps(r_uvws, l_uvws);
m_dx = _mm_set_ps1(rx - lx);
h_duvws = _mm_div_ps(h_duvws, m_dx);
//shrt_lx = short(lx);
//shrt_rx = short(rx);
short shrt_lx = (short)(flx>>16); //shift right 16 and cast to short
short shrt_rx = (short)(frx>>16); //same as flooring the float
pix = bit(shrt_lx, sy); //select the bit in screen and zbuffer that will be plotted
screen_ptr = &p_bits[pix];
zbuff_ptr = &z_buffer[pix];
//loop through the span
for(sx = shrt_lx; sx < shrt_rx; sx++)
{
if(f_uvws[2] > *zbuff_ptr)
{
*zbuff_ptr = f_uvws[2];
m_fin = _mm_set_ps1(f_uvws[2]);
m_fin = _mm_div_ps(h_uvws, m_fin);
pixel_x = short(fin[0] * widsub1) % widsub1;
pixel_y = short(fin[1] * hgtsub1) % hgtsub1;
texbit = textr->bits[pixel_y * textr->bm.bmWidth + pixel_x];
*screen_ptr = texbit;
}
zbuff_ptr++;
screen_ptr++;
h_uvws = _mm_add_ps(h_uvws, h_duvws);
}
//lsx += ml;
//rsx += mr;
flx += fml; //increment the left edge
frx += fmr; //increment the right edge
l_uvws = _mm_add_ps(l_uvws, l_duvws);
r_uvws = _mm_add_ps(r_uvws, r_duvws);
}
}