From: Paul Eggert Date: Tue, 3 May 2011 16:33:36 +0000 (-0700) Subject: [etc/ChangeLog] X-Git-Tag: emacs-pretest-24.0.90~104^2~275^2~92^2~14 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=680186416d09efb9c3b4599ee848e3bb9fe184b6;p=emacs.git [etc/ChangeLog] * NEWS: Integer overflow now yields floating-point instead of wrapping around. [doc/lispref/ChangeLog] * numbers.texi (Arithmetic Operations, Math Functions): Large integers go to floats instead of wrapping around. * objects.texi (Integer Type): Likewise. --- diff --git a/doc/lispref/ChangeLog b/doc/lispref/ChangeLog index 163de31f220..a48fa634cb7 100644 --- a/doc/lispref/ChangeLog +++ b/doc/lispref/ChangeLog @@ -1,6 +1,9 @@ 2011-05-03 Paul Eggert * numbers.texi (Integer Basics): Large integers are treated as floats. + (Arithmetic Operations, Math Functions): Large integers go to + floats instead of wrapping around. + * objects.texi (Integer Type): Likewise. 2011-04-30 Lars Magne Ingebrigtsen diff --git a/doc/lispref/numbers.texi b/doc/lispref/numbers.texi index 2c73a03a26c..ebf5660febe 100644 --- a/doc/lispref/numbers.texi +++ b/doc/lispref/numbers.texi @@ -507,9 +507,9 @@ commonly used. All of these functions except @code{%} return a floating point value if any argument is floating. - It is important to note that in Emacs Lisp, arithmetic functions -do not check for overflow. Thus @code{(1+ 268435455)} may evaluate to -@minus{}268435456, depending on your hardware. + If integer arithmetic overflows, the resulting value is converted +to floating point. Thus @code{(1+ 536870911)} may evaluate to +536870912.0, depending on your hardware. @defun 1+ number-or-marker This function returns @var{number-or-marker} plus 1. @@ -826,7 +826,7 @@ On the other hand, shifting one place to the right looks like this: As the example illustrates, shifting one place to the right divides the value of a positive integer by two, rounding downward. -The function @code{lsh}, like all Emacs Lisp arithmetic functions, does +The function @code{lsh} does not check for overflow, so shifting left can discard significant bits and change the sign of the number. For example, left shifting 536,870,911 produces @minus{}2 on a 30-bit machine: @@ -1169,8 +1169,8 @@ approximately. @defun expt x y This function returns @var{x} raised to power @var{y}. If both -arguments are integers and @var{y} is positive, the result is an -integer; in this case, overflow causes truncation, so watch out. +arguments are integers and @var{y} is nonnegative, the result is an +integer if it is in Emacs integer range. @end defun @defun sqrt arg diff --git a/doc/lispref/objects.texi b/doc/lispref/objects.texi index c58d54f13fc..6dd7878e53b 100644 --- a/doc/lispref/objects.texi +++ b/doc/lispref/objects.texi @@ -179,10 +179,10 @@ to @tex @math{2^{29}-1}) @end tex -on most machines. (Some machines may provide a wider range.) It is -important to note that the Emacs Lisp arithmetic functions do not check -for overflow. Thus @code{(1+ 536870911)} is @minus{}536870912 on most -machines. +on most machines. (Some machines may provide a wider range.) +If integer arithmetic overflows, the resulting value is converted ++to floating point. Thus @code{(1+ 536870911)} may evaluate to ++536870912.0, depending on your hardware. The read syntax for integers is a sequence of (base ten) digits with an optional sign at the beginning and an optional period at the end. The @@ -195,7 +195,8 @@ leading @samp{+} or a final @samp{.}. 1 ; @r{The integer 1.} 1. ; @r{Also the integer 1.} +1 ; @r{Also the integer 1.} -1073741825 ; @r{Also the integer 1 on a 30-bit implementation.} +1073741825 ; @r{The floating point number 1073741825.0,} + ; @r{on a 30-bit implementation.} @end group @end example diff --git a/etc/ChangeLog b/etc/ChangeLog index 0eb21406105..bd91ccc1c39 100644 --- a/etc/ChangeLog +++ b/etc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-03 Paul Eggert + + * NEWS: Integer overflow now yields floating-point instead of + wrapping around. + 2011-05-03 Leo Liu * NEWS: Mention the new command isearch-yank-pop. diff --git a/etc/NEWS b/etc/NEWS index 5094ecfc4fc..669c143ba7f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -728,6 +728,12 @@ soap-inspect.el is an interactive inspector for SOAP WSDL structures. * Incompatible Lisp Changes in Emacs 24.1 ++++ +** Integer arithmetic overflow now yields the nearest floating-piont +value rather than wrapping around. For example, on a 32-bit machine, +(1+ 536870911) yields 536870912.0, instead of the -536870912 it +yielded in Emacs 23.3, or the 0 it yielded in Emacs 23.1. + --- ** `char-direction-table' and the associated function `char-direction' were deleted. They were buggy and inferior to the new support of