diff options
| author | Paul Eggert | 2015-03-24 11:42:53 -0700 |
|---|---|---|
| committer | Paul Eggert | 2015-03-24 11:43:21 -0700 |
| commit | 711770da9101a94ada42881cb86a976d323e9348 (patch) | |
| tree | 71465e72be54b14ec973cbf50a4a424449b31a07 | |
| parent | 1e043f5e79bf67c9ebfa35623edcff0633d37a75 (diff) | |
| download | emacs-711770da9101a94ada42881cb86a976d323e9348.tar.gz emacs-711770da9101a94ada42881cb86a976d323e9348.zip | |
Fix minor ldexp issues
* doc/lispref/numbers.texi (Float Basics): Improve ldexp documentation.
* src/floatfns.c (Fldexp): Require 2 args. Avoid undefined behavior
if the exponent is out of 'int' range. Improve documentation.
Fixes: bug#20185
| -rw-r--r-- | doc/lispref/ChangeLog | 4 | ||||
| -rw-r--r-- | doc/lispref/numbers.texi | 12 | ||||
| -rw-r--r-- | src/ChangeLog | 7 | ||||
| -rw-r--r-- | src/floatfns.c | 10 |
4 files changed, 25 insertions, 8 deletions
diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index a546306f9e4..9b1bbb357a5 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog | |||
| @@ -1,3 +1,7 @@ | |||
| 1 | 2015-03-24 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | * numbers.texi (Float Basics): Improve ldexp documentation. | ||
| 4 | |||
| 1 | 2015-03-23 Eli Zaretskii <eliz@gnu.org> | 5 | 2015-03-23 Eli Zaretskii <eliz@gnu.org> |
| 2 | 6 | ||
| 3 | * commands.texi (Event Input Misc): Fix incorrect usage of @code. | 7 | * commands.texi (Event Input Misc): Fix incorrect usage of @code. |
diff --git a/doc/lispref/numbers.texi b/doc/lispref/numbers.texi index 8d1d3a798eb..7b4a0a6d407 100644 --- a/doc/lispref/numbers.texi +++ b/doc/lispref/numbers.texi | |||
| @@ -265,9 +265,15 @@ If @var{x} is a NaN, then @var{s} is also a NaN@. | |||
| 265 | If @var{x} is zero, then @var{e} is 0. | 265 | If @var{x} is zero, then @var{e} is 0. |
| 266 | @end defun | 266 | @end defun |
| 267 | 267 | ||
| 268 | @defun ldexp sig &optional exp | 268 | @defun ldexp s e |
| 269 | This function returns a floating-point number corresponding to the | 269 | Given a numeric significand @var{s} and an integer exponent @var{e}, |
| 270 | significand @var{sig} and exponent @var{exp}. | 270 | this function returns the floating point number |
| 271 | @ifnottex | ||
| 272 | @var{s} * 2**@var{e}. | ||
| 273 | @end ifnottex | ||
| 274 | @tex | ||
| 275 | @math{s 2^e}. | ||
| 276 | @end tex | ||
| 271 | @end defun | 277 | @end defun |
| 272 | 278 | ||
| 273 | @defun copysign x1 x2 | 279 | @defun copysign x1 x2 |
diff --git a/src/ChangeLog b/src/ChangeLog index 815c117308b..23f125c567d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,10 @@ | |||
| 1 | 2015-03-24 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | Fix minor ldexp issues | ||
| 4 | * floatfns.c (Fldexp): Require 2 args. Avoid undefined behavior | ||
| 5 | if the exponent is out of 'int' range. Improve documentation. | ||
| 6 | Fixes: bug#20185 | ||
| 7 | |||
| 1 | 2015-03-24 Daniel Colascione <dancol@dancol.org> | 8 | 2015-03-24 Daniel Colascione <dancol@dancol.org> |
| 2 | 9 | ||
| 3 | * process.c (Fprocess_running_child_p): Return number identifier of | 10 | * process.c (Fprocess_running_child_p): Return number identifier of |
diff --git a/src/floatfns.c b/src/floatfns.c index c68b9bd3a65..072e85776b5 100644 --- a/src/floatfns.c +++ b/src/floatfns.c | |||
| @@ -185,14 +185,14 @@ If X is zero, both parts (SGNFCAND and EXP) are zero. */) | |||
| 185 | return Fcons (make_float (sgnfcand), make_number (exponent)); | 185 | return Fcons (make_float (sgnfcand), make_number (exponent)); |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | DEFUN ("ldexp", Fldexp, Sldexp, 1, 2, 0, | 188 | DEFUN ("ldexp", Fldexp, Sldexp, 2, 2, 0, |
| 189 | doc: /* Construct number X from significand SGNFCAND and exponent EXP. | 189 | doc: /* Return X * 2**EXP, as a floating point number. |
| 190 | Returns the floating point value resulting from multiplying SGNFCAND | 190 | EXP must be an integer. */) |
| 191 | (the significand) by 2 raised to the power of EXP (the exponent). */) | ||
| 192 | (Lisp_Object sgnfcand, Lisp_Object exponent) | 191 | (Lisp_Object sgnfcand, Lisp_Object exponent) |
| 193 | { | 192 | { |
| 194 | CHECK_NUMBER (exponent); | 193 | CHECK_NUMBER (exponent); |
| 195 | return make_float (ldexp (XFLOATINT (sgnfcand), XINT (exponent))); | 194 | int e = min (max (INT_MIN, XINT (exponent)), INT_MAX); |
| 195 | return make_float (ldexp (XFLOATINT (sgnfcand), e)); | ||
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | DEFUN ("exp", Fexp, Sexp, 1, 1, 0, | 198 | DEFUN ("exp", Fexp, Sexp, 1, 1, 0, |