]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix timer.el minor rounding error
authorPaul Eggert <eggert@Penguin.CS.UCLA.EDU>
Wed, 5 Sep 2018 23:19:47 +0000 (16:19 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 5 Sep 2018 23:21:42 +0000 (16:21 -0700)
* lisp/emacs-lisp/timer.el (timer-next-integral-multiple-of-time):
Fix rounding error by using integers rather than floats.
* test/lisp/emacs-lisp/timer-tests.el (timer-test-multiple-of-time):
New test.

lisp/emacs-lisp/timer.el
test/lisp/emacs-lisp/timer-tests.el

index 795554fec58e0218afd99af30c42f43f2e86a82d..74d37b0eaedd9deccd6319560979c0c99af38e5a 100644 (file)
@@ -102,14 +102,14 @@ fire each time Emacs is idle for that many seconds."
   "Yield the next value after TIME that is an integral multiple of SECS.
 More precisely, the next value, after TIME, that is an integral multiple
 of SECS seconds since the epoch.  SECS may be a fraction."
-  (let* ((trillion 1e12)
+  (let* ((trillion 1000000000000)
         (time-sec (+ (nth 1 time)
-                     (* 65536.0 (nth 0 time))))
+                     (* 65536 (nth 0 time))))
         (delta-sec (mod (- time-sec) secs))
-        (next-sec (+ time-sec (ffloor delta-sec)))
-        (next-sec-psec (ffloor (* trillion (mod delta-sec 1))))
+        (next-sec (+ time-sec (floor delta-sec)))
+        (next-sec-psec (floor (* trillion (mod delta-sec 1))))
         (sub-time-psec (+ (or (nth 3 time) 0)
-                          (* 1e6 (nth 2 time))))
+                          (* 1000000 (nth 2 time))))
         (psec-diff (- sub-time-psec next-sec-psec)))
     (if (and (<= next-sec time-sec) (< 0 psec-diff))
        (setq next-sec-psec (+ sub-time-psec
index 65e5dc9bde9cf1a9952d20532421bf5c20244740..fa92c1b64aa16982b4680f41f5a424c61fa1d0d5 100644 (file)
@@ -39,4 +39,9 @@
   (if (fboundp 'debug-timer-check)
       (should (debug-timer-check)) t))
 
+(ert-deftest timer-test-multiple-of-time ()
+  (should (equal
+           (timer-next-integral-multiple-of-time '(0 0 0 1) (1+ (ash 1 53)))
+           (list (ash 1 (- 53 16)) 1 0 0))))
+
 ;;; timer-tests.el ends here