fix wrong result in casin and many related complex functions
authorRich Felker <dalias@aerifal.cx>
Mon, 9 Apr 2018 16:33:17 +0000 (12:33 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 9 Apr 2018 17:25:35 +0000 (13:25 -0400)
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
src/complex/casinf.c
src/complex/casinl.c

index dfdda988bafcda9403b7e03ef55f4a0eaf9349a9..01ed61841ea4dc3447b76ec1b9470114a605fc62 100644 (file)
@@ -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));
 }
index 93f0e335092b02241445a50461c70e88b6295594..4fcb76fc57597b6b899cfa72c666b2aaa20b2765 100644 (file)
@@ -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));
 }
index 0916c60f2a6b3c7eeb71d74c4cff06a5a1273fae..3b7ceba7a31fff8e87c27dbf0a87dcc63407cb8d 100644 (file)
@@ -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