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: g.peterh...@t-online.de
  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

Reply via email to