Browse Source

fix cacosh results for arguments with negative imaginary part

Michael Morrell 5 years ago
parent
commit
aa2d23e57c
3 changed files with 12 additions and 3 deletions
  1. 4 1
      src/complex/cacosh.c
  2. 4 1
      src/complex/cacoshf.c
  3. 4 1
      src/complex/cacoshl.c

+ 4 - 1
src/complex/cacosh.c

@@ -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));
 }

+ 4 - 1
src/complex/cacoshf.c

@@ -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));
 }

+ 4 - 1
src/complex/cacoshl.c

@@ -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