fix cacosh results for arguments with negative imaginary part
authorMichael Morrell <mmorrell@tachyum.com>
Mon, 14 Oct 2019 13:07:31 +0000 (09:07 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 14 Oct 2019 13:08:22 +0000 (09:08 -0400)
src/complex/cacosh.c
src/complex/cacoshf.c
src/complex/cacoshl.c

index 8e42f1ae86ed5556933a3f0dca8b7a6b9130ffcc..76127f75f4bb1b4369bf98d209c0089e2ff86bca 100644 (file)
@@ -4,6 +4,9 @@
 
 double complex cacosh(double complex z)
 {
+       int zineg = signbit(cimag(z));
+
        z = cacos(z);
-       return CMPLX(-cimag(z), creal(z));
+       if (zineg) return CMPLX(cimag(z), -creal(z));
+       else       return CMPLX(-cimag(z), creal(z));
 }
index d7e6b545474dd299bea83bf8a06e73fab49f6413..8bd80581ae0d7d2ad42ceed52332570078f50943 100644 (file)
@@ -2,6 +2,9 @@
 
 float complex cacoshf(float complex z)
 {
+       int zineg = signbit(cimagf(z));
+
        z = cacosf(z);
-       return CMPLXF(-cimagf(z), crealf(z));
+       if (zineg) return CMPLXF(cimagf(z), -crealf(z));
+       else       return CMPLXF(-cimagf(z), crealf(z));
 }
index d3eaee204f6d51a13c8932e0e2e68fe708536b78..3a284be9c68c2e01819449e48e5116bedfbbf24d 100644 (file)
@@ -8,7 +8,10 @@ long double complex cacoshl(long double complex z)
 #else
 long double complex cacoshl(long double complex z)
 {
+       int zineg = signbit(cimagl(z));
+
        z = cacosl(z);
-       return CMPLXL(-cimagl(z), creall(z));
+       if (zineg) return CMPLXL(cimagl(z), -creall(z));
+       else       return CMPLXL(-cimagl(z), creall(z));
 }
 #endif