summaryrefslogblamecommitdiff
path: root/system/musl/complex-math.patch
blob: fff4b59c17119f7e42ede4335e564cc69656f8cd (plain) (tree)


























































                                                                      
From ae2a01da2e388535da243b3d974aef74a3c06ae0 Mon Sep 17 00:00:00 2001
From: Rich Felker <dalias@aerifal.cx>
Date: Mon, 9 Apr 2018 12:33:17 -0400
Subject: fix wrong result in casin and many related complex functions

the factor of -i noted in the comment at the top of casin.c was
omitted from the actual code, yielding a result rotated 90 degrees and
propagating into errors in other functions defined in terms of casin.

implement multiplication by -i as a rotation of the real and imaginary
parts of the result, rather than by actual multiplication, since the
latter cannot be optimized without knowledge that the operand is
finite. here, the rotation is the actual intent, anyway.
---
 src/complex/casin.c  | 3 ++-
 src/complex/casinf.c | 3 ++-
 src/complex/casinl.c | 3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/complex/casin.c b/src/complex/casin.c
index dfdda98..01ed618 100644
--- a/src/complex/casin.c
+++ b/src/complex/casin.c
@@ -12,5 +12,6 @@ double complex casin(double complex z)
 	x = creal(z);
 	y = cimag(z);
 	w = CMPLX(1.0 - (x - y)*(x + y), -2.0*x*y);
-	return clog(CMPLX(-y, x) + csqrt(w));
+	double complex r = clog(CMPLX(-y, x) + csqrt(w));
+	return CMPLX(cimag(r), -creal(r));
 }
diff --git a/src/complex/casinf.c b/src/complex/casinf.c
index 93f0e33..4fcb76f 100644
--- a/src/complex/casinf.c
+++ b/src/complex/casinf.c
@@ -10,5 +10,6 @@ float complex casinf(float complex z)
 	x = crealf(z);
 	y = cimagf(z);
 	w = CMPLXF(1.0 - (x - y)*(x + y), -2.0*x*y);
-	return clogf(CMPLXF(-y, x) + csqrtf(w));
+	float complex r = clogf(CMPLXF(-y, x) + csqrtf(w));
+	return CMPLXF(cimagf(r), -crealf(r));
 }
diff --git a/src/complex/casinl.c b/src/complex/casinl.c
index 0916c60..3b7ceba 100644
--- a/src/complex/casinl.c
+++ b/src/complex/casinl.c
@@ -15,6 +15,7 @@ long double complex casinl(long double complex z)
 	x = creall(z);
 	y = cimagl(z);
 	w = CMPLXL(1.0 - (x - y)*(x + y), -2.0*x*y);
-	return clogl(CMPLXL(-y, x) + csqrtl(w));
+	long double complex r = clogl(CMPLXL(-y, x) + csqrtl(w));
+	return CMPLXL(cimagl(r), -creall(r));
 }
 #endif
-- 
cgit v0.11.2