emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/lisp/ls-lisp.el,v


From: Eli Zaretskii
Subject: [Emacs-diffs] Changes to emacs/lisp/ls-lisp.el,v
Date: Fri, 25 Apr 2008 09:00:31 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Eli Zaretskii <eliz>    08/04/25 09:00:31

Index: ls-lisp.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/ls-lisp.el,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -b -r1.73 -r1.74
--- ls-lisp.el  10 Apr 2008 14:09:40 -0000      1.73
+++ ls-lisp.el  25 Apr 2008 09:00:31 -0000      1.74
@@ -532,14 +532,27 @@
                (let ((inode (nth 10 file-attr)))
                  (if (consp inode)
                      (if (consp (cdr inode))
-                         (format " %17.0f "
-                                 (+ (* (car inode) 1099511627776.0)
+                         ;; 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 " %17.0f "
+                                      (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))))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]