The downside to using floats is the amount of FLASH consumed by the code, and CPU time could be an issue. If those aren't problems for you, just use floats.
One way to deal with it is to simulate fixed point by scaling the values by 10 or 100 - just multiple everything by the scale factor, do the math, then divide the result by the scale factor. e.g.:
#define SCALE 10
...
// not simplified, we'll make it readable and let the compiler optimize
bearing = (180 * SCALE + 180 * SCALE * (w1 * SCALE - delta* SCALE) / 1024 * SCALE - (2 * delta * SCALE))/ SCALE;
Of course, instead of explicitly scaling each value, you could store everything scaled.
-j