libstdc++
std_abs.h
Go to the documentation of this file.
1 // -*- C++ -*- C library enhancements header.
2 
3 // Copyright (C) 2016-2025 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library. This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /** @file include/bits/std_abs.h
26  * This is an internal header file, included by other library headers.
27  * Do not attempt to use it directly. @headername{cmath, cstdlib}
28  */
29 
30 #ifndef _GLIBCXX_BITS_STD_ABS_H
31 #define _GLIBCXX_BITS_STD_ABS_H
32 
33 #ifdef _GLIBCXX_SYSHDR
34 #pragma GCC system_header
35 #endif
36 
37 #include <bits/c++config.h>
38 
39 #pragma GCC diagnostic push
40 #pragma GCC diagnostic ignored "-Wpedantic" // include_next
41 #pragma GCC diagnostic ignored "-Wlong-long"
42 
43 #define _GLIBCXX_INCLUDE_NEXT_C_HEADERS
44 #include_next <stdlib.h>
45 #ifdef __CORRECT_ISO_CPP_MATH_H_PROTO
46 # include_next <math.h>
47 #endif
48 #undef _GLIBCXX_INCLUDE_NEXT_C_HEADERS
49 
50 #undef abs
51 
52 extern "C++"
53 {
54 namespace std _GLIBCXX_VISIBILITY(default)
55 {
56 _GLIBCXX_BEGIN_NAMESPACE_VERSION
57 
58  using ::abs;
59 
60 #ifndef __CORRECT_ISO_CPP_STDLIB_H_PROTO
61  inline long
62  abs(long __i) { return __builtin_labs(__i); }
63 #endif
64 
65 #ifdef _GLIBCXX_USE_LONG_LONG
66  inline long long
67  abs(long long __x) { return __builtin_llabs (__x); }
68 #endif
69 
70 // _GLIBCXX_RESOLVE_LIB_DEFECTS
71 // 2192. Validity and return type of std::abs(0u) is unclear
72 // 2294. <cstdlib> should declare abs(double)
73 // 2735. std::abs(short), std::abs(signed char) and others should return int
74 
75 #ifndef __CORRECT_ISO_CPP_MATH_H_PROTO
76  inline _GLIBCXX_CONSTEXPR double
77  abs(double __x)
78  { return __builtin_fabs(__x); }
79 
80  inline _GLIBCXX_CONSTEXPR float
81  abs(float __x)
82  { return __builtin_fabsf(__x); }
83 
84  inline _GLIBCXX_CONSTEXPR long double
85  abs(long double __x)
86  { return __builtin_fabsl(__x); }
87 #endif
88 
89 #if defined(__GLIBCXX_TYPE_INT_N_0)
90  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_0
91  abs(__GLIBCXX_TYPE_INT_N_0 __x) { return __x >= 0 ? __x : -__x; }
92 #endif
93 #if defined(__GLIBCXX_TYPE_INT_N_1)
94  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_1
95  abs(__GLIBCXX_TYPE_INT_N_1 __x) { return __x >= 0 ? __x : -__x; }
96 #endif
97 #if defined(__GLIBCXX_TYPE_INT_N_2)
98  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_2
99  abs(__GLIBCXX_TYPE_INT_N_2 __x) { return __x >= 0 ? __x : -__x; }
100 #endif
101 #if defined(__GLIBCXX_TYPE_INT_N_3)
102  __extension__ inline _GLIBCXX_CONSTEXPR __GLIBCXX_TYPE_INT_N_3
103  abs(__GLIBCXX_TYPE_INT_N_3 __x) { return __x >= 0 ? __x : -__x; }
104 #endif
105 
106 #if defined(__STDCPP_FLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
107  constexpr _Float16
108  abs(_Float16 __x)
109  { return _Float16(__builtin_fabsf(__x)); }
110 #endif
111 
112 #if defined(__STDCPP_FLOAT32_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
113  constexpr _Float32
114  abs(_Float32 __x)
115  { return __builtin_fabsf(__x); }
116 #endif
117 
118 #if defined(__STDCPP_FLOAT64_T__) && defined(_GLIBCXX_DOUBLE_IS_IEEE_BINARY64)
119  constexpr _Float64
120  abs(_Float64 __x)
121  { return __builtin_fabs(__x); }
122 #endif
123 
124 #if defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
125  constexpr _Float128
126  abs(_Float128 __x)
127  { return __builtin_fabsl(__x); }
128 #elif defined(__STDCPP_FLOAT128_T__) && defined(_GLIBCXX_HAVE_FLOAT128_MATH)
129  constexpr _Float128
130  abs(_Float128 __x)
131  { return __builtin_fabsf128(__x); }
132 #endif
133 
134 #if defined(__STDCPP_BFLOAT16_T__) && defined(_GLIBCXX_FLOAT_IS_IEEE_BINARY32)
135  constexpr __gnu_cxx::__bfloat16_t
136  abs(__gnu_cxx::__bfloat16_t __x)
137  { return __gnu_cxx::__bfloat16_t(__builtin_fabsf(__x)); }
138 #endif
139 
140 #if !defined(__STRICT_ANSI__) && defined(_GLIBCXX_USE_FLOAT128)
141  __extension__ inline _GLIBCXX_CONSTEXPR
142  __float128
143  abs(__float128 __x)
144  {
145 #if defined(_GLIBCXX_LDOUBLE_IS_IEEE_BINARY128)
146  return __builtin_fabsl(__x);
147 #elif defined(_GLIBCXX_HAVE_FLOAT128_MATH)
148  return __builtin_fabsf128(__x);
149 #else
150  // Assume that __builtin_signbit works for __float128.
151  return __builtin_signbit(__x) ? -__x : __x;
152 #endif
153  }
154 #endif
155 
156 _GLIBCXX_END_NAMESPACE_VERSION
157 } // namespace
158 } // extern "C++"
159 
160 #pragma GCC diagnostic pop
161 
162 #endif // _GLIBCXX_BITS_STD_ABS_H
_Tp abs(const complex< _Tp > &)
Return magnitude of z.
Definition: complex:968
ISO C++ entities toplevel namespace is std.