История изменений
Исправление beastie, (текущая версия) :
Тут вишенька на торте в том, что из -3.141 надо элегантно оставить -3.141, +2.718 оставить как +2.718, не трогать +0.0, и только -0.0 починить в +0.0.
Т.ч. fabs тут немного мимо кассы.
Если уж совсем по феншую, то альтернативно можно и так:
float fixNegZero(float x) {
    return x == 0.0 && signbit(x) ? -x : x;
}
PS: -0.0 == 0.0, поэтому простым сравнением negZero не отловишь.
Исходная версия beastie, :
Тут вишенька на торте в том, что из -3.141 надо элегантно оставить -3.141, +2.718 оставить как +2.718, не трогать +0.0, и только -0.0 починить в +0.0.
Т.ч. fabs тут немного мимо кассы.
Если уж совсем по феншую, то альтернативно можно и так:
float fixNegZero(float x) {
    return x == 0 && signbit(x) ? -x : x
}
PS: -0.0 == 0.0, поэтому простым сравнением negZero не отловишь.