For example, I think the things it does which are sensible for most people are:
* Rounding subnormals to zero
* Disabling signed zeroes
* Disables support for 'trapping' (throwing SIGFPE)
Then there are the 'middle' things, which annoy some people:
* Allow associative operations, and things like sqrt(xy)=sqrt(x)sqrt(y), exp(x)*exp(y)=exp(x+y)
However, it also (which I often find break code) assumes no operation will make a NaN or an Infinity -- these last two don't really help, and also break code in confusing ways. This being gcc, they don't just change things like std::isnan or std::isinf into an 'abort' (which would make sense, in -ffast-math they don't make sense), they just return nonsense instead.
specifically 1
And YMMV when it comes to other arch's and compilers (and -fmath settings).
(For the record, it does a whole lot of terrible things: https://stackoverflow.com/questions/7420665/what-does-gccs-f... )
It also will do things like using an approximate reciprocal square root instruction plus a refinement iteration instead of fsqrt then fdiv.
https://news.ycombinator.com/item?id=29482350 - Understanding Fast-Math (2021)