emacs-bug-tracker
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debbugs-tracker] bug#25785: closed (scm_c_make_polar broken on APPLE)


From: GNU bug Tracking System
Subject: [debbugs-tracker] bug#25785: closed (scm_c_make_polar broken on APPLE)
Date: Tue, 21 Feb 2017 21:11:02 +0000

Your message dated Tue, 21 Feb 2017 22:10:40 +0100
with message-id <address@hidden>
and subject line Re: bug#25785: scm_c_make_polar broken on APPLE
has caused the debbugs.gnu.org bug report #25785,
regarding scm_c_make_polar broken on APPLE
to be marked as done.

(If you believe you have received this mail in error, please contact
address@hidden)


-- 
25785: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=25785
GNU Bug Tracking System
Contact address@hidden with problems
--- Begin Message --- Subject: scm_c_make_polar broken on APPLE Date: Sat, 18 Feb 2017 09:37:54 -0800
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 <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;


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

Attachment: sincos.patch
Description: Binary data



--- End Message ---
--- Begin Message --- Subject: Re: bug#25785: scm_c_make_polar broken on APPLE Date: Tue, 21 Feb 2017 22:10:40 +0100 User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)
Thanks!


--- End Message ---

reply via email to

[Prev in Thread] Current Thread [Next in Thread]