diff options
| author | Paul Eggert | 2017-03-07 08:29:19 -0800 |
|---|---|---|
| committer | Paul Eggert | 2017-03-07 08:32:04 -0800 |
| commit | 14af3395e6d8a2a95268138355ade408743922ac (patch) | |
| tree | 85a38267025e4af11bb490d89129846273129e2a /src/floatfns.c | |
| parent | 641ce935b79c63020553f33fc5ca8f4d05e56b0b (diff) | |
| download | emacs-14af3395e6d8a2a95268138355ade408743922ac.tar.gz emacs-14af3395e6d8a2a95268138355ade408743922ac.zip | |
Define copysign on all platforms
* configure.ac (copysign): Remove test.
* src/floatfns.c (signbit): New macro, if not already defined.
(Fcopysign): Use it instead of copysign.
(Fcopysign, syms_of_floatfns): Define the function on all platforms.
Diffstat (limited to 'src/floatfns.c')
| -rw-r--r-- | src/floatfns.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/floatfns.c b/src/floatfns.c index 4c09036ac79..8534f1d04e4 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -147,7 +147,12 @@ DEFUN ("isnan", Fisnan, Sisnan, 1, 1, 0, | |||
| 147 | return isnan (XFLOAT_DATA (x)) ? Qt : Qnil; | 147 | return isnan (XFLOAT_DATA (x)) ? Qt : Qnil; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | #ifdef HAVE_COPYSIGN | 150 | /* Although the substitute does not work on NaNs, it is good enough |
| 151 | for platforms lacking the signbit macro. */ | ||
| 152 | #ifndef signbit | ||
| 153 | # define signbit(x) ((x) < 0 || (IEEE_FLOATING_POINT && !(x) && 1 / (x) < 0)) | ||
| 154 | #endif | ||
| 155 | |||
| 151 | DEFUN ("copysign", Fcopysign, Scopysign, 2, 2, 0, | 156 | DEFUN ("copysign", Fcopysign, Scopysign, 2, 2, 0, |
| 152 | doc: /* Copy sign of X2 to value of X1, and return the result. | 157 | doc: /* Copy sign of X2 to value of X1, and return the result. |
| 153 | Cause an error if X1 or X2 is not a float. */) | 158 | Cause an error if X1 or X2 is not a float. */) |
| @@ -161,9 +166,10 @@ Cause an error if X1 or X2 is not a float. */) | |||
| 161 | f1 = XFLOAT_DATA (x1); | 166 | f1 = XFLOAT_DATA (x1); |
| 162 | f2 = XFLOAT_DATA (x2); | 167 | f2 = XFLOAT_DATA (x2); |
| 163 | 168 | ||
| 164 | return make_float (copysign (f1, f2)); | 169 | /* Use signbit instead of copysign, to avoid calling make_float when |
| 170 | the result is X1. */ | ||
| 171 | return signbit (f1) != signbit (f2) ? make_float (-f1) : x1; | ||
| 165 | } | 172 | } |
| 166 | #endif | ||
| 167 | 173 | ||
| 168 | DEFUN ("frexp", Ffrexp, Sfrexp, 1, 1, 0, | 174 | DEFUN ("frexp", Ffrexp, Sfrexp, 1, 1, 0, |
| 169 | doc: /* Get significand and exponent of a floating point number. | 175 | doc: /* Get significand and exponent of a floating point number. |
| @@ -552,9 +558,7 @@ syms_of_floatfns (void) | |||
| 552 | defsubr (&Ssin); | 558 | defsubr (&Ssin); |
| 553 | defsubr (&Stan); | 559 | defsubr (&Stan); |
| 554 | defsubr (&Sisnan); | 560 | defsubr (&Sisnan); |
| 555 | #ifdef HAVE_COPYSIGN | ||
| 556 | defsubr (&Scopysign); | 561 | defsubr (&Scopysign); |
| 557 | #endif | ||
| 558 | defsubr (&Sfrexp); | 562 | defsubr (&Sfrexp); |
| 559 | defsubr (&Sldexp); | 563 | defsubr (&Sldexp); |
| 560 | defsubr (&Sfceiling); | 564 | defsubr (&Sfceiling); |