https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109758
Bug ID: 109758
Summary: quadmath abs
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libquadmath
Assignee: unassigned at gcc dot gnu.org
Reporter: [email protected]
Target Milestone: ---
Hello gcc-team,
Problem:
#include <boost/cstdfloat.hpp>
#include <iostream>
#include <limits>
#include <cmath>
using T = __float128;
int main()
{
const T
neg_nan_v = -std::numeric_limits<T>::quiet_NaN();
std::cout << neg_nan_v << std::endl;
std::cout << "std::abs " << std::abs(neg_nan_v) << std::endl;
std::cout << "fabsq " << fabsq(neg_nan_v) << std::endl;
std::cout << "builtin " << __builtin_fabsf128(neg_nan_v) << std::endl;
}
-nan
std::abs -nan
fabsq nan
builtin nan
The problem can be found in bits/std_abs.h:
#if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
__extension__ inline _GLIBCXX_CONSTEXPR
__float128
abs(__float128 __x)
{
return __x < 0 ? -__x : __x;
}
#endif
Is this actually correct? If I compile with -U__STRICT_ANSI__ or remove/comment
abs from bits/std_abs.h abs falls back to fabsq, which then also works.
With std::abs(float/double/...) this problem does not occur.
Wouldn't it make sense in principle to also provide a C++ header
(quadmath.hpp)?
#include <quadmath.h>
namespace std
{
math-functions
to_string/to_wstring
to_chars/from_chars
operator<<
operator>>
...
}
thx
Gero