Le 20/01/2017 à 20:01, Matt Wette a écrit : > >> On Jan 19, 2017, at 7:01 PM, Matt Wette > > wrote: >> >> >>> On Jan 18, 2017, at 6:26 PM, Andy Wingo >> > wrote: >>> >>> We are pleased to announce GNU Guile release 2.1.6. >>> >>> Guile 2.1.6 is the sixth pre-release in what will eventually become the >>> 2.2 release series. We encourage you to test this release and provide >>> feedback to guile-devel@gnu.org . >> >> Saw this one last round. Mac OS, now gcc-6.3.0: >> >> ;;; ("#i1@-0" 1.0 -0.0) >> FAIL: numbers.test: string->number: valid complex number strings >> >> I am going to see if I can generate the assembly. > > Short story: scm_c_make_polar is broken for the Mac. Guile needs to > decide if it want to use __sincos() on Mac, or suppress optimization, > or ... > > I was able to get the above to work (guile-2.1.5) by using > SCM > +#ifdef __APPLE__ > +__attribute__((optimize("O0"))) > +#endif > scm_c_make_polar (double mag, double ang) > > > 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; > > Incidentally, the above program will not compile on my machine w/ > gcc-6.3.0. “gcc -std=c11” or “gcc -std=c99” will not recognize the > standard macro CMPLX(). > > > wow!