summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2018-04-09 12:33:17 -0400
committerRich Felker <dalias@aerifal.cx>2018-04-09 13:25:35 -0400
commitae2a01da2e388535da243b3d974aef74a3c06ae0 (patch)
tree2ab4469ed5f3989c385b3dc50c58199f9affb593 /src
parentea81529fb92932a50f06bf7a19cae812ae6cdb59 (diff)
downloadmusl-ae2a01da2e388535da243b3d974aef74a3c06ae0.tar.gz
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.
Diffstat (limited to 'src')
-rw-r--r--src/complex/casin.c3
-rw-r--r--src/complex/casinf.c3
-rw-r--r--src/complex/casinl.c3
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