[libcxx-commits] [libcxx] [libcxx] replaces `sqrt(complex<T>)` implementation with builtin (PR #122391)

via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jan 9 15:47:43 PST 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Christopher Di Bella (cjdb)

<details>
<summary>Changes</summary>

This significantly improves the accuracy of the function.

Fixes #<!-- -->122172

---
Full diff: https://github.com/llvm/llvm-project/pull/122391.diff


1 Files Affected:

- (modified) libcxx/include/complex (+13-8) 


``````````diff
diff --git a/libcxx/include/complex b/libcxx/include/complex
index df18159595b34d..3858a07d34eea6 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -1059,16 +1059,21 @@ inline _LIBCPP_HIDE_FROM_ABI complex<_Tp> log10(const complex<_Tp>& __x) {
 
 // sqrt
 
+_LIBCPP_HIDE_FROM_ABI inline _Complex float __csqrt(_Complex float __v) {
+  return __builtin_csqrtf(__v);
+}
+
+_LIBCPP_HIDE_FROM_ABI inline _Complex double __csqrt(_Complex double __v) {
+  return __builtin_csqrt(__v);
+}
+
+_LIBCPP_HIDE_FROM_ABI inline _Complex long double __csqrt(_Complex long double __v) {
+  return __builtin_csqrtl(__v);
+}
+
 template <class _Tp>
 _LIBCPP_HIDE_FROM_ABI complex<_Tp> sqrt(const complex<_Tp>& __x) {
-  if (std::isinf(__x.imag()))
-    return complex<_Tp>(_Tp(INFINITY), __x.imag());
-  if (std::isinf(__x.real())) {
-    if (__x.real() > _Tp(0))
-      return complex<_Tp>(__x.real(), std::isnan(__x.imag()) ? __x.imag() : std::copysign(_Tp(0), __x.imag()));
-    return complex<_Tp>(std::isnan(__x.imag()) ? __x.imag() : _Tp(0), std::copysign(__x.real(), __x.imag()));
-  }
-  return std::polar(std::sqrt(std::abs(__x)), std::arg(__x) / _Tp(2));
+  return complex<_Tp>(__from_builtin_tag(), std::__csqrt(__x.__builtin()));
 }
 
 // exp

``````````

</details>


https://github.com/llvm/llvm-project/pull/122391


More information about the libcxx-commits mailing list