4 ms·
-ffast-mast does a whole bunch of things, which I wish people's didn't so commonly combine. For example, I think the things it does which are sensible for most
by CJefferson 2y ago
-ffast-mast does a whole bunch of things, which I wish people's didn't so commonly combine.
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.
- clausecker 2y agoFor me, the most important part is -fno-math-errno which allows the compiler to ignore that libm functions are allowed to set errno. This is perfectly safe (unless you rely on that rarely known side effect) and is usually the one flag I explicitly set.
- gary_0 2y agoAnd the primary benefit of doing that is so the compiler can inline math functions like sqrt() as a tiny number of instructions (on modern CPUs) instead of having to call the standard C function, which is much slower.
- adgjlsfhk1 2y ago> as a tiny number of instructions specifically 1
- gary_0 2y agoFor sqrt() on x86_64 and gcc/clang, yes. But functions like fmod() are generally more instructions. And as for trig functions like sin(), AFAIK most compilers will always use a function call, because the x86 trig instructions don't have good speed/accuracy compared to a modern stdlib. And YMMV when it comes to other arch's and compilers (and -fmath settings).
- CJefferson 2y agoYou are absolutely right, I forgot one of the most important things piled into -ffast-math!