The future of fpclassify.hpp
I'm opening this as a place for discussion really.
We currently have boost::math::fpclassify/isnan/isinf/isnormal etc which began life as workarounds for C++03 compilers, but they have another role: for IEEE conforming types they work even in the presence of -ffast-math.
Now, I have some dim recollection, that gcc/clang used to replace say std::isnan(x) with a literal false even with just -O3. And that we had some very inscrutable bug reports caused by this. However, that appears not to be the case with current releases, so perhaps this has been fixed/changed?
So... I'm undecided whether the boost functions should become synonyms for the std ones, but just wanted to flag the issue.
Yeah replacing std::isnan(x) with false is the worst!
Here's a godbolt to play around with the compiler flags.
Summarizing:
- gcc 10.2:
-O3 -ffast-math->std::isnan(x)always is false. However, the flag is-O3 -ffast-math -fno-finite-math-onlygets the correct behavior. iccappears to get it right no matter what the flag is.clang 11does the "wrong" thing with-O3 -ffast-math, and does the "right" thing with-O3as well as-O3 -ffast-math -fno-finite-math-only.