Hi Thomas >(unsigned char)(atan2((double) (x - me->p_x),>(double) (me->p_y - y)) / 3.141592 * 128.);>>I am fairly certain per-C99 that the result of casting a negative floating>point to any unsigned type is undefined, so exactly what happens may vary>by architecture and compiler."If the value of the integral part cannot be represented by the integer type, the behavior is undefined. … The remaindering operation performed when a value of integer type is converted to unsigned type need not be performed when a value of real floating type is converted to unsigned type." Solution: (unsigned char)(int)(atan2((double) (x - me->p_x), (double) (me->p_y - y)) / 3.141592 * 128.) But the value of pi is incorrectly rounded and those double casts are unnecessary; in any case we clearly do not need double precision: (unsigned char)(int)(atan2f((x - me->p_x), (me->p_y - y)) / 3.141593 * 128.) >I am not certain how the course system works, but guessing from the fact>that it needs to fit in an unsigned char, I am thinking that 127 + the>absolute value would be a good guess>(1) Does all that sound correct?Not quite. Due north 0.0 maps to 0, not 127. >(2) How is the unsigned char-based course system expected to work?>360 degrees carved into 255 slices? Or Something else?It is 360 degrees unequally divided into 256 slices: "0" has twice the normal width and "180" has zero width. Fixing this requires rounding rather than truncation. With C99 and IMO clearer layout: (unsigned char) (int) ( roundf( 128.f*atan2f( dx, dy )/3.141593f ) ) Cheers Michael