Le 20/01/2017 à 20:01, Matt Wette a écrit :
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 address@hidden.
Saw this one last round. Mac OS, now
gcc-6.3.0:
;;; ("address@hidden" 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 <stdio.h>
#include <stdint.h>
#include <math.h>
#include <complex.h>
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!
|