aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorPaul Eggert2017-03-02 09:11:11 -0800
committerPaul Eggert2017-03-02 09:12:49 -0800
commit4e2622bf0d63c40f447d44e6401ea054ef55b261 (patch)
tree10f66df3cd59695ffe15546aaa961987a3fe2ba1 /src/bytecode.c
parentd546be31a9320d94769cb322f008f49d08d852a8 (diff)
downloademacs-4e2622bf0d63c40f447d44e6401ea054ef55b261.tar.gz
emacs-4e2622bf0d63c40f447d44e6401ea054ef55b261.zip
Fix rounding errors in <, =, etc.
* etc/NEWS: Document this. * src/bytecode.c (exec_byte_code): * src/data.c (arithcompare): Do not lose information when comparing floats to integers. * test/src/data-tests.el (data-tests-=, data-tests-<) (data-tests->, data-tests-<=, data-tests->=): Test this.
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c14
1 files changed, 5 insertions, 9 deletions
diff --git a/src/bytecode.c b/src/bytecode.c
index 4414b077bb9..e781a87d16f 100644
--- a/src/bytecode.c
+++ b/src/bytecode.c
@@ -992,18 +992,14 @@ exec_byte_code (Lisp_Object bytestr, Lisp_Object vector, Lisp_Object maxdepth,
992 CASE (Beqlsign): 992 CASE (Beqlsign):
993 { 993 {
994 Lisp_Object v2 = POP, v1 = TOP; 994 Lisp_Object v2 = POP, v1 = TOP;
995 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1);
996 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2);
997 bool equal;
998 if (FLOATP (v1) || FLOATP (v2)) 995 if (FLOATP (v1) || FLOATP (v2))
996 TOP = arithcompare (v1, v2, ARITH_EQUAL);
997 else
999 { 998 {
1000 double f1 = FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1); 999 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1);
1001 double f2 = FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2); 1000 CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2);
1002 equal = f1 == f2; 1001 TOP = EQ (v1, v2) ? Qt : Qnil;
1003 } 1002 }
1004 else
1005 equal = XINT (v1) == XINT (v2);
1006 TOP = equal ? Qt : Qnil;
1007 NEXT; 1003 NEXT;
1008 } 1004 }
1009 1005