• Paul Eggert's avatar
    Fix time-add rounding bug · f9fd12a3
    Paul Eggert authored
    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.