From 4e2622bf0d63c40f447d44e6401ea054ef55b261 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Thu, 2 Mar 2017 09:11:11 -0800 Subject: 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. --- src/bytecode.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) (limited to 'src/bytecode.c') 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, CASE (Beqlsign): { Lisp_Object v2 = POP, v1 = TOP; - CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); - CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); - bool equal; if (FLOATP (v1) || FLOATP (v2)) + TOP = arithcompare (v1, v2, ARITH_EQUAL); + else { - double f1 = FLOATP (v1) ? XFLOAT_DATA (v1) : XINT (v1); - double f2 = FLOATP (v2) ? XFLOAT_DATA (v2) : XINT (v2); - equal = f1 == f2; + CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v1); + CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (v2); + TOP = EQ (v1, v2) ? Qt : Qnil; } - else - equal = XINT (v1) == XINT (v2); - TOP = equal ? Qt : Qnil; NEXT; } -- cgit v1.2.3