For floats you can reliably compare less than and greater than. Do not compare them for equality. But you should be able to test when the sign changes using these with no problem.
Perhaps I don't understand the problem.
Code:
bool SignChanged(float fPrevValue,float fCurValue)
{
if ((fPrevValue<0.0f && fCurValue>0.0f) ||
(fPrevValue>0.0f && fCurValue<0.0f) )
{
return true;
} else return false;
}
This won't test for equality but if the result is right at 0.0f it will return false. It will only return true if the sign has changed. Note that due to the way that floats are represented in memory there will be some slight imprecision in this method.