--- gsl-1.15.orig/complex/math.c 2010-12-26 18:57:08.000000000 +0100 +++ gsl-1.15/complex/math.c 2011-11-12 23:34:02.046480953 +0100 @@ -301,7 +301,7 @@ gsl_complex_sqrt (gsl_complex a) else { double ai = GSL_IMAG (a); - double vi = (ai >= 0) ? w : -w; + double vi = (signbit(ai)) ? -w : w; GSL_SET_COMPLEX (&z, ai / (2.0 * vi), vi); } } @@ -537,6 +537,7 @@ gsl_complex_arcsin (gsl_complex a) if (I == 0) { z = gsl_complex_arcsin_real (R); + GSL_SET_IMAG (&z, copysign(GSL_IMAG(z), I)); } else { @@ -628,6 +629,7 @@ gsl_complex_arccos (gsl_complex a) if (I == 0) { z = gsl_complex_arccos_real (R); + GSL_SET_IMAG (&z, -copysign(GSL_IMAG(z), I)); } else { @@ -760,6 +762,7 @@ gsl_complex_arctan (gsl_complex a) { GSL_SET_COMPLEX (&z, 0, imag); }; + GSL_SET_REAL (&z, copysign(GSL_REAL(z), R)); } else { @@ -936,7 +939,7 @@ gsl_complex gsl_complex_arccosh (gsl_complex a) { /* z = arccosh(a) */ gsl_complex z = gsl_complex_arccos (a); - z = gsl_complex_mul_imag (z, GSL_IMAG(z) > 0 ? -1.0 : 1.0); + z = gsl_complex_mul_imag (z, signbit(GSL_IMAG(z)) ? 1.0 : -1.0); return z; } @@ -967,17 +970,22 @@ gsl_complex_arccosh_real (double a) gsl_complex gsl_complex_arctanh (gsl_complex a) { /* z = arctanh(a) */ - if (GSL_IMAG (a) == 0.0) + gsl_complex z; + double I = GSL_IMAG (a); + + if (I == 0.0) { - return gsl_complex_arctanh_real (GSL_REAL (a)); + z = gsl_complex_arctanh_real (GSL_REAL (a)); + GSL_SET_IMAG (&z, copysign(GSL_IMAG(z), I)); } else { - gsl_complex z = gsl_complex_mul_imag(a, 1.0); + z = gsl_complex_mul_imag(a, 1.0); z = gsl_complex_arctan (z); z = gsl_complex_mul_imag (z, -1.0); - return z; } + + return z; } gsl_complex