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

Christopher Di Bella via libcxx-commits libcxx-commits at lists.llvm.org
Thu Jan 9 15:52:24 PST 2025


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

>From 484e554e35aa0a07dc7193dda3989c27ba1eddfe Mon Sep 17 00:00:00 2001
From: Christopher Di Bella <cjdb at google.com>
Date: Thu, 9 Jan 2025 23:44:15 +0000
Subject: [PATCH 1/2] [libcxx] replaces `sqrt(complex<T>)` implementation with
 builtin

This significantly improves the accuracy of the function.

Fixes #122172
---
 libcxx/include/complex | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

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

>From ec503b4523723980f3807d7f9e5de6f2832e8500 Mon Sep 17 00:00:00 2001
From: Christopher Di Bella <cjdb at google.com>
Date: Thu, 9 Jan 2025 23:52:12 +0000
Subject: [PATCH 2/2] applies clang-format

---
 libcxx/include/complex | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/libcxx/include/complex b/libcxx/include/complex
index 3858a07d34eea6..890417288295e0 100644
--- a/libcxx/include/complex
+++ b/libcxx/include/complex
@@ -1059,17 +1059,11 @@ 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 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 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);
-}
+_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) {



More information about the libcxx-commits mailing list