1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-27 10:54:40 +00:00

(/ N) now returns the reciprocal of N

This is more compatible with Common Lisp and XEmacs (Bug#21690).  See:
http://lists.gnu.org/archive/html/emacs-devel/2015-10/msg01053.html
* lisp/color.el (color-hue-to-rgb, color-hsl-to-rgb)
(color-xyz-to-srgb, color-xyz-to-lab):
* lisp/emacs-lisp/cl-extra.el (cl-float-limits):
* lisp/net/shr-color.el (shr-color-hue-to-rgb)
(shr-color-hsl-to-rgb-fractions):
Exploit the change to simplify the code a bit.
* lisp/emacs-lisp/bytecomp.el (byte-compile-quo):
Don’t complain about single-argument calls to ‘/’.
* src/data.c (arith_driver, float_arith_driver):
Implement the change.
This commit is contained in:
Paul Eggert 2015-10-20 18:16:47 -07:00
parent 513fe25a50
commit e9af822ac3
7 changed files with 41 additions and 23 deletions

View File

@ -642,10 +642,11 @@ product. When given no arguments, @code{*} returns 1.
@end example
@end defun
@defun / dividend divisor &rest divisors
This function divides @var{dividend} by @var{divisor} and returns the
quotient. If there are additional arguments @var{divisors}, then it
divides @var{dividend} by each divisor in turn. Each argument may be a
@defun / number &rest divisors
With one or more @var{divisors}, this function divides @var{number}
by each divisor in @var{divisors} in turn, and returns the quotient.
With no @var{divisors}, this function returns 1/@var{number}, i.e.,
the multiplicative inverse of @var{number}. Each argument may be a
number or a marker.
If all the arguments are integers, the result is an integer, obtained
@ -673,6 +674,14 @@ by rounding the quotient towards zero after each division.
@result{} 2.5
@end group
@group
(/ 4.0)
@result{} 0.25
@end group
@group
(/ 4)
@result{} 0
@end group
@group
(/ 25 3 2)
@result{} 4
@end group

View File

@ -1008,6 +1008,12 @@ dynamically.
dynamically. Any third-party code that changes these templates should
be updated accordingly.
+++
** (/ N) is now equivalent to (/ 1 N) rather than to (/ N 1).
The new behavior is compatible with Common Lisp and with XEmacs.
This change does not affect Lisp code intended to be portable to
Emacs 24.2 and earlier, which did not support unary /.
* Lisp Changes in Emacs 25.1

View File

@ -93,7 +93,7 @@ resulting list."
"Compute hue from V1 and V2 H.
Used internally by `color-hsl-to-rgb'."
(cond
((< h (/ 1.0 6)) (+ v1 (* (- v2 v1) h 6.0)))
((< h (/ 6.0)) (+ v1 (* (- v2 v1) h 6.0)))
((< h 0.5) v2)
((< h (/ 2.0 3)) (+ v1 (* (- v2 v1) (- (/ 2.0 3) h) 6.0)))
(t v1)))
@ -110,9 +110,9 @@ inclusive."
(- (+ L S) (* L S))))
(m1 (- (* 2.0 L) m2)))
(list
(color-hue-to-rgb m1 m2 (mod (+ H (/ 1.0 3)) 1))
(color-hue-to-rgb m1 m2 (mod (+ H (/ 3.0)) 1))
(color-hue-to-rgb m1 m2 H)
(color-hue-to-rgb m1 m2 (mod (- H (/ 1.0 3)) 1))))))
(color-hue-to-rgb m1 m2 (mod (- H (/ 3.0)) 1))))))
(defun color-complement-hex (color)
"Return the color that is the complement of COLOR, in hexadecimal format."
@ -199,13 +199,13 @@ RED, GREEN and BLUE should be between 0.0 and 1.0, inclusive."
(b (+ (* 0.0556434 X) (* -0.2040259 Y) (* 1.0572252 Z))))
(list (if (<= r 0.0031308)
(* 12.92 r)
(- (* 1.055 (expt r (/ 1 2.4))) 0.055))
(- (* 1.055 (expt r (/ 2.4))) 0.055))
(if (<= g 0.0031308)
(* 12.92 g)
(- (* 1.055 (expt g (/ 1 2.4))) 0.055))
(- (* 1.055 (expt g (/ 2.4))) 0.055))
(if (<= b 0.0031308)
(* 12.92 b)
(- (* 1.055 (expt b (/ 1 2.4))) 0.055)))))
(- (* 1.055 (expt b (/ 2.4))) 0.055)))))
(defconst color-d65-xyz '(0.950455 1.0 1.088753)
"D65 white point in CIE XYZ.")
@ -222,13 +222,13 @@ conversion. If omitted or nil, use `color-d65-xyz'."
(yr (/ Y Yr))
(zr (/ Z Zr))
(fx (if (> xr color-cie-ε)
(expt xr (/ 1 3.0))
(expt xr (/ 3.0))
(/ (+ (* color-cie-κ xr) 16) 116.0)))
(fy (if (> yr color-cie-ε)
(expt yr (/ 1 3.0))
(expt yr (/ 3.0))
(/ (+ (* color-cie-κ yr) 16) 116.0)))
(fz (if (> zr color-cie-ε)
(expt zr (/ 1 3.0))
(expt zr (/ 3.0))
(/ (+ (* color-cie-κ zr) 16) 116.0))))
(list
(- (* 116 fy) 16) ; L

View File

@ -3617,8 +3617,8 @@ discarding."
(defun byte-compile-quo (form)
(let ((len (length form)))
(cond ((<= len 2)
(byte-compile-subr-wrong-args form "2 or more"))
(cond ((< len 2)
(byte-compile-subr-wrong-args form "1 or more"))
((= len 3)
(byte-compile-two-args form))
(t

View File

@ -497,7 +497,7 @@ This sets the values of: `cl-most-positive-float', `cl-most-negative-float',
(setq cl-least-positive-normalized-float y
cl-least-negative-normalized-float (- y))
;; Divide down until value underflows to zero.
(setq x (/ 1 z) y x)
(setq x (/ z) y x)
(while (condition-case _ (> (/ x 2) 0) (arith-error nil))
(setq x (/ x 2)))
(setq cl-least-positive-float x

View File

@ -211,7 +211,7 @@ This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\"."
"Convert X Y H to RGB value."
(when (< h 0) (incf h))
(when (> h 1) (decf h))
(cond ((< h (/ 1 6.0)) (+ x (* (- y x) h 6)))
(cond ((< h (/ 6.0)) (+ x (* (- y x) h 6)))
((< h 0.5) y)
((< h (/ 2.0 3.0)) (+ x (* (- y x) (- (/ 2.0 3.0) h) 6)))
(t x)))
@ -223,9 +223,9 @@ This will convert \"80 %\" to 204, \"100 %\" to 255 but \"123\" to \"123\"."
(setq m2 (* l (+ s 1)))
(setq m2 (- (+ l s) (* l s))))
(setq m1 (- (* l 2) m2))
(list (shr-color-hue-to-rgb m1 m2 (+ h (/ 1 3.0)))
(list (shr-color-hue-to-rgb m1 m2 (+ h (/ 3.0)))
(shr-color-hue-to-rgb m1 m2 h)
(shr-color-hue-to-rgb m1 m2 (- h (/ 1 3.0))))))
(shr-color-hue-to-rgb m1 m2 (- h (/ 3.0))))))
(defun shr-color->hexadecimal (color)
"Convert any color format to hexadecimal representation.

View File

@ -2603,6 +2603,7 @@ arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args)
accum = 0;
break;
case Amult:
case Adiv:
accum = 1;
break;
case Alogand:
@ -2658,7 +2659,7 @@ arith_driver (enum arithop code, ptrdiff_t nargs, Lisp_Object *args)
accum *= next;
break;
case Adiv:
if (!argnum)
if (! (argnum || nargs == 1))
accum = next;
else
{
@ -2727,7 +2728,7 @@ float_arith_driver (double accum, ptrdiff_t argnum, enum arithop code,
accum *= next;
break;
case Adiv:
if (!argnum)
if (! (argnum || nargs == 1))
accum = next;
else
{
@ -2782,9 +2783,11 @@ usage: (* &rest NUMBERS-OR-MARKERS) */)
}
DEFUN ("/", Fquo, Squo, 1, MANY, 0,
doc: /* Return first argument divided by all the remaining arguments.
doc: /* Divide number by divisors and return the result.
With two or more arguments, return first argument divided by the rest.
With one argument, return 1 divided by the argument.
The arguments must be numbers or markers.
usage: (/ DIVIDEND &rest DIVISORS) */)
usage: (/ NUMBER &rest DIVISORS) */)
(ptrdiff_t nargs, Lisp_Object *args)
{
ptrdiff_t argnum;