git: 6f59cb79e84a - stable/14 - lib/msun: cpow{,f,l}(CMLX(0.0, 0.0)) should return 1.0

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Fri, 19 Sep 2025 01:00:37 UTC
The branch stable/14 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=6f59cb79e84a86d7b864d709652ec57b6928a6cf

commit 6f59cb79e84a86d7b864d709652ec57b6928a6cf
Author:     Steve Kargl <kargl@FreeBSD.org>
AuthorDate: 2025-09-11 16:38:17 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2025-09-19 00:59:55 +0000

    lib/msun: cpow{,f,l}(CMLX(0.0, 0.0)) should return 1.0
    
    PR:     289447
    
    (cherry picked from commit 8b41ba845c7e10b5f241a1f944fe9a8e19ad75a9)
---
 lib/msun/src/s_cpow.c  | 5 ++++-
 lib/msun/src/s_cpowf.c | 5 ++++-
 lib/msun/src/s_cpowl.c | 5 ++++-
 3 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/lib/msun/src/s_cpow.c b/lib/msun/src/s_cpow.c
index b887db51aa2a..2c20a8f3b48b 100644
--- a/lib/msun/src/s_cpow.c
+++ b/lib/msun/src/s_cpow.c
@@ -58,7 +58,10 @@ cpow(double complex a, double complex z)
 	y = cimag (z);
 	absa = cabs (a);
 	if (absa == 0.0) {
-		return (CMPLX(0.0, 0.0));
+		if (x == 0 && y == 0)
+		    return (CMPLX(1., 0.));
+		else
+		    return (CMPLX(0., 0.));
 	}
 	arga = carg (a);
 	r = pow (absa, x);
diff --git a/lib/msun/src/s_cpowf.c b/lib/msun/src/s_cpowf.c
index 144291079f97..b8bdbd9cb07b 100644
--- a/lib/msun/src/s_cpowf.c
+++ b/lib/msun/src/s_cpowf.c
@@ -57,7 +57,10 @@ cpowf(float complex a, float complex z)
 	y = cimagf(z);
 	absa = cabsf (a);
 	if (absa == 0.0f) {
-		return (CMPLXF(0.0f, 0.0f));
+		if (x == 0 && y == 0)
+		    return (CMPLXF(1.f, 0.f));
+		else
+		    return (CMPLXF(0.f, 0.f));
 	}
 	arga = cargf (a);
 	r = powf (absa, x);
diff --git a/lib/msun/src/s_cpowl.c b/lib/msun/src/s_cpowl.c
index 39797cadcfcb..efbe4936895f 100644
--- a/lib/msun/src/s_cpowl.c
+++ b/lib/msun/src/s_cpowl.c
@@ -57,7 +57,10 @@ cpowl(long double complex a, long double complex z)
 	y = cimagl(z);
 	absa = cabsl(a);
 	if (absa == 0.0L) {
-		return (CMPLXL(0.0L, 0.0L));
+		if (x == 0 && y == 0)
+		    return (CMPLXL(1.L, 0.L));
+		else
+		    return (CMPLXL(0.L, 0.L));
 	}
 	arga = cargl(a);
 	r = powl(absa, x);