From f9fd12a30b3d94eb48f7b309907d136d7b2682ac Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 16 Aug 2019 16:25:02 -0700 Subject: Fix time-add rounding bug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this fix, time arithmetic yielded results that were not mathematically accurate, even though the exact results were representable; for example, (time-add 0 1e-13) yielded a timestamp equal to 0 instead of to 1e-13. * lisp/timezone.el (timezone-time-from-absolute): Let time-add do its thing rather than using floating point internally, which has rounding errors. We now have bignums and so don’t need floating point to avoid overflow issues. * src/timefns.c (timeform_sub_ps_p): New function. (time_arith): If either argument is a float, represent the result exactly instead of discarding sub-ps info. * test/lisp/timezone-tests.el (timezone-tests-time-from-absolute): Don’t assume (HI LO US PS) timestamp format. * test/src/emacs-module-tests.el (mod-test-add-nanosecond/valid): Don’t assume that time-add discards sub-ns info. * test/src/timefns-tests.el (time-rounding-tests): Add regression test to detect time-add rounding bug. --- test/lisp/timezone-tests.el | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'test/lisp/timezone-tests.el') diff --git a/test/lisp/timezone-tests.el b/test/lisp/timezone-tests.el index 4b5f5617ecd..c374042fa5d 100644 --- a/test/lisp/timezone-tests.el +++ b/test/lisp/timezone-tests.el @@ -135,9 +135,10 @@ (should (equal (timezone-zone-to-minute "*invalid*") 0))) (ert-deftest timezone-tests-time-from-absolute () - (should (equal (timezone-time-from-absolute (* 2020 365) ; Jan 1 2020 - (* 12 60 60)) ; 12:00 - '(23911 48704 0 0)))) + (should (time-equal-p + (timezone-time-from-absolute (* 2020 365) ; Jan 1 2020 + (* 12 60 60)) ; 12:00 + '(23911 48704 0 0)))) ;; TODO: Write tests for timezone-tests-time-zone-from-absolute, which is a ;; bit tricky since the results depend on `current-time-zone'. -- cgit v1.2.3