The future of fpclassify.hpp
Opened this issue · 1 comments
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-only
gets the correct behavior. icc
appears to get it right no matter what the flag is.clang 11
does the "wrong" thing with-O3 -ffast-math
, and does the "right" thing with-O3
as well as-O3 -ffast-math -fno-finite-math-only
.