mirror of
https://gitlab.alpinelinux.org/alpine/aports.git
synced 2025-08-05 13:27:09 +02:00
60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
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: [PATCH] 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 dfdda988..01ed6184 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 93f0e335..4fcb76fc 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 0916c60f..3b7ceba7 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
|
|
--
|
|
2.17.0
|
|
|