constexpr int
ilogb(_Float16 __x)
- { return _Float16(__builtin_ilogbf(__x)); }
+ { return __builtin_ilogbf(__x); }
constexpr _Float16
lgamma(_Float16 __x)
constexpr long long
llrint(_Float16 __x)
- { return _Float16(__builtin_llrintf(__x)); }
+ { return __builtin_llrintf(__x); }
constexpr long long
llround(_Float16 __x)
- { return _Float16(__builtin_llroundf(__x)); }
+ { return __builtin_llroundf(__x); }
constexpr _Float16
log1p(_Float16 __x)
constexpr long
lrint(_Float16 __x)
- { return _Float16(__builtin_lrintf(__x)); }
+ { return __builtin_lrintf(__x); }
constexpr long
lround(_Float16 __x)
- { return _Float16(__builtin_lroundf(__x)); }
+ { return __builtin_lroundf(__x); }
constexpr _Float16
nearbyint(_Float16 __x)
constexpr int
ilogb(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_ilogbf(__x)); }
+ { return __builtin_ilogbf(__x); }
constexpr __gnu_cxx::__bfloat16_t
lgamma(__gnu_cxx::__bfloat16_t __x)
constexpr long long
llrint(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_llrintf(__x)); }
+ { return __builtin_llrintf(__x); }
constexpr long long
llround(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_llroundf(__x)); }
+ { return __builtin_llroundf(__x); }
constexpr __gnu_cxx::__bfloat16_t
log1p(__gnu_cxx::__bfloat16_t __x)
constexpr long
lrint(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_lrintf(__x)); }
+ { return __builtin_lrintf(__x); }
constexpr long
lround(__gnu_cxx::__bfloat16_t __x)
- { return __gnu_cxx::__bfloat16_t(__builtin_lroundf(__x)); }
+ { return __builtin_lroundf(__x); }
constexpr __gnu_cxx::__bfloat16_t
nearbyint(__gnu_cxx::__bfloat16_t __x)
--- /dev/null
+// Copyright (C) 2024 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-do run { target c++23 } }
+// { dg-require-cmath "" }
+
+#include <stdfloat>
+#include <cmath>
+#include <limits>
+#include <testsuite_hooks.h>
+
+template <typename T>
+void
+test ()
+{
+ using lim = std::numeric_limits<T>;
+ int t0 = std::ilogb(T(4.0));
+ VERIFY( t0 == 2 );
+ int t1 = std::ilogb(lim::infinity());
+ VERIFY( t1 == INT_MAX );
+ int t2 = std::ilogb(-lim::infinity());
+ VERIFY( t2 == INT_MAX );
+}
+
+int
+main ()
+{
+#if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::float16_t>();
+#endif
+#if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::float32_t>();
+#endif
+#if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
+ test <std::float64_t>();
+#endif
+#if defined(__STDCPP_FLOAT128_T__) \
+ && (defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128) \
+ || defined(_GLIBCXX_HAVE_FLOAT128_MATH))
+ test <std::float128_t>();
+#endif
+#if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
+ test <std::bfloat16_t>();
+#endif
+}