]> git.eshelyaron.com Git - emacs.git/commitdiff
(ls-lisp-format): Fix last change.
authorEli Zaretskii <eliz@gnu.org>
Fri, 25 Apr 2008 09:03:19 +0000 (09:03 +0000)
committerEli Zaretskii <eliz@gnu.org>
Fri, 25 Apr 2008 09:03:19 +0000 (09:03 +0000)
lisp/ChangeLog
lisp/ls-lisp.el

index d0c371b19b9989887271146538f2983ef2d219c4..da619ce06a324c74c8b4c87d88fb644ac9a7016e 100644 (file)
@@ -1,3 +1,7 @@
+2008-04-25  Eli Zaretskii  <eliz@gnu.org>
+
+       * ls-lisp.el (ls-lisp-format): Fix last change.
+
 2008-04-24  Nick Roberts  <nickrob@snap.net.nz>
 
        * progmodes/gdb-ui.el (gdb-invalidate-assembler): Compare numeric
index 2ce3c9dfd6b235f2a2eb18239c4bf4801d05c7be..e1e1053188084ebc0fa51ef511611bbd2f92a307 100644 (file)
@@ -532,14 +532,27 @@ SWITCHES, TIME-INDEX and NOW give the full switch list and time data."
                (let ((inode (nth 10 file-attr)))
                  (if (consp inode)
                      (if (consp (cdr inode))
-                         (format " %17.0f "
-                                 (+ (* (car inode) 1099511627776.0)
-                                    (* (cadr inode) 65536.0)
-                                    (cddr inode)))
-                       (format " %17.0f "
+                         ;; 2^(24+16) = 1099511627776.0, but
+                         ;; multiplying by it and then adding the
+                         ;; other members of the cons cell in one go
+                         ;; loses precision, since a double does not
+                         ;; have enough significant digits to hold a
+                         ;; full 64-bit value.  So below we split
+                         ;; 1099511627776 into high 13 and low 5
+                         ;; digits and compute in two parts.
+                         (let ((p1 (* (car inode) 10995116.0))
+                               (p2 (+ (* (car inode) 27776.0)
+                                      (* (cadr inode) 65536.0)
+                                      (cddr inode))))
+                           (format " %13.0f%05.0f "
+                                   ;; Use floor to emulate integer
+                                   ;; division.
+                                   (+ p1 (floor p2 100000.0))
+                                   (mod p2 100000.0)))
+                       (format " %18.0f "
                                (+ (* (car inode) 65536.0)
                                   (cdr inode))))
-                   (format " %17d " inode))))
+                   (format " %18d " inode))))
            ;; nil is treated like "" in concat
            (if (memq ?s switches)      ; size in K
                (format " %4.0f" (fceiling (/ file-size 1024.0))))