numbers.c:scm_c_make_polar in guile-2.1.7 breaks on APPLE (macOS 10.12). Reason: APPLE does not have sincos(), and gcc will optimize sin/cos to use cexp(), and cexp() does not preserve sign of zero. Patch includes (and attached) for guile-2.1.7. This uses macOS __sincos(). Example: In scm_c_make_polar, “gcc -O2” turns sin(), cos() into cexp(), since cexp(i*x) = cos(x) + i*sin(x): gcc -O0 => LM4339: movq -32(%rbp), %rax movd %rax, %xmm0 call _sin movd %xmm0, %rax movq %rax, -8(%rbp) LM4340: movq -32(%rbp), %rax movd %rax, %xmm0 call _cos movd %xmm0, %rax movq %rax, -16(%rbp) gcc -O2 => pxor %xmm0, %xmm0 LVL2703: call _cexp I wrote a little C program to show that cexp() does not preserve the zero-signed-ness: cos,sin: +1.000000 -0.000000 __sincos: +1.000000 -0.000000 cexp: +1.000000 +0.000000 The scm_c_make_polar will use sincos() if available, but macOS does not have sincos(), it has __sincos(). #include #include #include #include extern double z, p, n; int main() { double complex c; double d, sine, cosine; d = z*n; printf(" cos,sin: %+f %+f\n", cos(d), sin(d)); __sincos(d, &sine, &cosine); printf("__sincos: %+f %+f\n", cosine, sine); c = cexp(CMPLX(0.0, d)); printf(" cexp: %+f %+f\n", creal(c), cimag(c)); } double z = 0.0, p = +1.0, n = -1.0; --- configure.ac.orig 2017-02-18 08:35:06.000000000 -0800 +++ configure.ac 2017-02-18 08:35:26.000000000 -0800 @@ -1152,8 +1152,9 @@ # asinh, acosh, atanh, trunc - C99 standard, generally not available on # older systems # sincos - GLIBC extension +# __sincos - APPLE extension # -AC_CHECK_FUNCS(asinh acosh atanh copysign finite sincos trunc) +AC_CHECK_FUNCS(asinh acosh atanh copysign finite sincos __sincos trunc) # C99 specifies isinf and isnan as macros. # HP-UX provides only macros, no functions. --- libguile/numbers.c.patch.labs 2017-02-18 08:31:21.000000000 -0800 +++ libguile/numbers.c 2017-02-18 08:34:18.000000000 -0800 @@ -9109,6 +9109,8 @@ details. */ #if (defined HAVE_SINCOS) && (defined __GLIBC__) && (defined _GNU_SOURCE) sincos (ang, &s, &c); +#elif (defined HAVE___SINCOS) + __sincos (ang, &s, &c); #else s = sin (ang); c = cos (ang);