xref: /freebsd-src/contrib/llvm-project/libcxx/include/__math/inverse_trigonometric_functions.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
25f757f3fSDimitry Andric //
35f757f3fSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f757f3fSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f757f3fSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f757f3fSDimitry Andric //
75f757f3fSDimitry Andric //===----------------------------------------------------------------------===//
85f757f3fSDimitry Andric 
95f757f3fSDimitry Andric #ifndef _LIBCPP___MATH_INVERSE_TRIGONOMETRIC_FUNCTIONS_H
105f757f3fSDimitry Andric #define _LIBCPP___MATH_INVERSE_TRIGONOMETRIC_FUNCTIONS_H
115f757f3fSDimitry Andric 
125f757f3fSDimitry Andric #include <__config>
135f757f3fSDimitry Andric #include <__type_traits/enable_if.h>
145f757f3fSDimitry Andric #include <__type_traits/is_arithmetic.h>
155f757f3fSDimitry Andric #include <__type_traits/is_integral.h>
165f757f3fSDimitry Andric #include <__type_traits/is_same.h>
175f757f3fSDimitry Andric #include <__type_traits/promote.h>
185f757f3fSDimitry Andric 
195f757f3fSDimitry Andric #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
205f757f3fSDimitry Andric #  pragma GCC system_header
215f757f3fSDimitry Andric #endif
225f757f3fSDimitry Andric 
235f757f3fSDimitry Andric _LIBCPP_BEGIN_NAMESPACE_STD
245f757f3fSDimitry Andric 
255f757f3fSDimitry Andric namespace __math {
265f757f3fSDimitry Andric 
275f757f3fSDimitry Andric // acos
285f757f3fSDimitry Andric 
295f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float acos(float __x) _NOEXCEPT { return __builtin_acosf(__x); }
305f757f3fSDimitry Andric 
315f757f3fSDimitry Andric template <class = int>
325f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI double acos(double __x) _NOEXCEPT {
335f757f3fSDimitry Andric   return __builtin_acos(__x);
345f757f3fSDimitry Andric }
355f757f3fSDimitry Andric 
365f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double acos(long double __x) _NOEXCEPT { return __builtin_acosl(__x); }
375f757f3fSDimitry Andric 
385f757f3fSDimitry Andric template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
395f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI double acos(_A1 __x) _NOEXCEPT {
405f757f3fSDimitry Andric   return __builtin_acos((double)__x);
415f757f3fSDimitry Andric }
425f757f3fSDimitry Andric 
435f757f3fSDimitry Andric // asin
445f757f3fSDimitry Andric 
455f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float asin(float __x) _NOEXCEPT { return __builtin_asinf(__x); }
465f757f3fSDimitry Andric 
475f757f3fSDimitry Andric template <class = int>
485f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI double asin(double __x) _NOEXCEPT {
495f757f3fSDimitry Andric   return __builtin_asin(__x);
505f757f3fSDimitry Andric }
515f757f3fSDimitry Andric 
525f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double asin(long double __x) _NOEXCEPT { return __builtin_asinl(__x); }
535f757f3fSDimitry Andric 
545f757f3fSDimitry Andric template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
555f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI double asin(_A1 __x) _NOEXCEPT {
565f757f3fSDimitry Andric   return __builtin_asin((double)__x);
575f757f3fSDimitry Andric }
585f757f3fSDimitry Andric 
595f757f3fSDimitry Andric // atan
605f757f3fSDimitry Andric 
615f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float atan(float __x) _NOEXCEPT { return __builtin_atanf(__x); }
625f757f3fSDimitry Andric 
635f757f3fSDimitry Andric template <class = int>
645f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan(double __x) _NOEXCEPT {
655f757f3fSDimitry Andric   return __builtin_atan(__x);
665f757f3fSDimitry Andric }
675f757f3fSDimitry Andric 
685f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan(long double __x) _NOEXCEPT { return __builtin_atanl(__x); }
695f757f3fSDimitry Andric 
705f757f3fSDimitry Andric template <class _A1, __enable_if_t<is_integral<_A1>::value, int> = 0>
715f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI double atan(_A1 __x) _NOEXCEPT {
725f757f3fSDimitry Andric   return __builtin_atan((double)__x);
735f757f3fSDimitry Andric }
745f757f3fSDimitry Andric 
755f757f3fSDimitry Andric // atan2
765f757f3fSDimitry Andric 
775f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI float atan2(float __y, float __x) _NOEXCEPT { return __builtin_atan2f(__y, __x); }
785f757f3fSDimitry Andric 
795f757f3fSDimitry Andric template <class = int>
805f757f3fSDimitry Andric _LIBCPP_HIDE_FROM_ABI double atan2(double __x, double __y) _NOEXCEPT {
815f757f3fSDimitry Andric   return __builtin_atan2(__x, __y);
825f757f3fSDimitry Andric }
835f757f3fSDimitry Andric 
845f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI long double atan2(long double __y, long double __x) _NOEXCEPT {
855f757f3fSDimitry Andric   return __builtin_atan2l(__y, __x);
865f757f3fSDimitry Andric }
875f757f3fSDimitry Andric 
885f757f3fSDimitry Andric template <class _A1, class _A2, __enable_if_t<is_arithmetic<_A1>::value && is_arithmetic<_A2>::value, int> = 0>
895f757f3fSDimitry Andric inline _LIBCPP_HIDE_FROM_ABI typename __promote<_A1, _A2>::type atan2(_A1 __y, _A2 __x) _NOEXCEPT {
905f757f3fSDimitry Andric   using __result_type = typename __promote<_A1, _A2>::type;
91*0fca6ea1SDimitry Andric   static_assert(!(_IsSame<_A1, __result_type>::value && _IsSame<_A2, __result_type>::value), "");
925f757f3fSDimitry Andric   return __math::atan2((__result_type)__y, (__result_type)__x);
935f757f3fSDimitry Andric }
945f757f3fSDimitry Andric 
955f757f3fSDimitry Andric } // namespace __math
965f757f3fSDimitry Andric 
975f757f3fSDimitry Andric _LIBCPP_END_NAMESPACE_STD
985f757f3fSDimitry Andric 
995f757f3fSDimitry Andric #endif // _LIBCPP___MATH_INVERSE_TRIGONOMETRIC_FUNCTIONS_H
100