]> git.ipfire.org Git - thirdparty/zstd.git/commitdiff
In Verbose Mode, Preserve Full Precision Where Possible
authorW. Felix Handte <w@felixhandte.com>
Wed, 9 Jun 2021 19:22:59 +0000 (15:22 -0400)
committerW. Felix Handte <w@felixhandte.com>
Thu, 10 Jun 2021 16:53:07 +0000 (12:53 -0400)
programs/util.c
programs/util.h
programs/zstdcli.c

index 964d60ee20f6e6804a03ae860756aa758bf40fcb..c8f6d1886a150a6d2160d5e67e1b03b3433a829b 100644 (file)
@@ -305,37 +305,55 @@ U64 UTIL_getFileSizeStat(const stat_t* statbuf)
 
 UTIL_HumanReadableSize_t UTIL_makeHumanReadableSize(U64 size) {
     UTIL_HumanReadableSize_t hrs;
-    if (size >= (1ull << 60)) {
-        hrs.value = (float)size / (1ull << 60);
-        hrs.suffix = "E";
-    } else if (size >= (1ull << 50)) {
-        hrs.value = (float)size / (1ull << 50);
-        hrs.suffix = "P";
-    } else if (size >= (1ull << 40)) {
-        hrs.value = (float)size / (1ull << 40);
-        hrs.suffix = "T";
-    } else if (size >= (1ull << 30)) {
-        hrs.value = (float)size / (1ull << 30);
-        hrs.suffix = "G";
-    } else if (size >= (1ull << 20)) {
-        hrs.value = (float)size / (1ull << 20);
-        hrs.suffix = "M";
-    } else if (size >= (1ull << 10)) {
-        hrs.value = (float)size / (1ull << 10);
-        hrs.suffix = "K";
-    } else {
-        hrs.value = (float)size;
-        hrs.suffix = "";
-    }
 
-    if (hrs.value >= 100 || (U64)hrs.value == size) {
-        hrs.precision = 0;
-    } else if (hrs.value >= 10) {
-        hrs.precision = 1;
-    } else if (hrs.value > 1) {
-        hrs.precision = 2;
+    if (g_utilDisplayLevel > 2) {
+        /* In verbose mode, do not scale sizes down, except in the case of
+         * values that exceed the integral precision of a double. */
+        if (size >= (1ull << 53)) {
+            hrs.value = (double)size / (1ull << 20);
+            hrs.suffix = "M";
+            /* At worst, a double representation of a maximal size will be
+             * accurate to better than tens of kilobytes. */
+            hrs.precision = 2;
+        } else {
+            hrs.value = (double)size;
+            hrs.suffix = "";
+            hrs.precision = 0;
+        }
     } else {
-        hrs.precision = 3;
+        /* In regular mode, scale sizes down and use suffixes. */
+        if (size >= (1ull << 60)) {
+            hrs.value = (double)size / (1ull << 60);
+            hrs.suffix = "E";
+        } else if (size >= (1ull << 50)) {
+            hrs.value = (double)size / (1ull << 50);
+            hrs.suffix = "P";
+        } else if (size >= (1ull << 40)) {
+            hrs.value = (double)size / (1ull << 40);
+            hrs.suffix = "T";
+        } else if (size >= (1ull << 30)) {
+            hrs.value = (double)size / (1ull << 30);
+            hrs.suffix = "G";
+        } else if (size >= (1ull << 20)) {
+            hrs.value = (double)size / (1ull << 20);
+            hrs.suffix = "M";
+        } else if (size >= (1ull << 10)) {
+            hrs.value = (double)size / (1ull << 10);
+            hrs.suffix = "K";
+        } else {
+            hrs.value = (double)size;
+            hrs.suffix = "";
+        }
+
+        if (hrs.value >= 100 || (U64)hrs.value == size) {
+            hrs.precision = 0;
+        } else if (hrs.value >= 10) {
+            hrs.precision = 1;
+        } else if (hrs.value > 1) {
+            hrs.precision = 2;
+        } else {
+            hrs.precision = 3;
+        }
     }
 
     return hrs;
index 63cd0c3780590ad94443fa4face748eaa24dcdc9..f146f3a08aa5547b9e3450aa2e9c6335e0617865 100644 (file)
@@ -177,7 +177,7 @@ U64 UTIL_getTotalFileSize(const char* const * fileNamesTable, unsigned nbFiles);
  * precision, value, suffix order to a "%.*f%s" format string.
  */
 typedef struct {
-  float value;
+  double value;
   int precision;
   const char* suffix;
 } UTIL_HumanReadableSize_t;
index 9e2133c4f867f74c6f4eacf7b608ba6c257d5515..32cd5af86110dd76321aaab913c8cab47455c78e 100644 (file)
@@ -1146,8 +1146,9 @@ int main(int const argCount, const char* argv[])
     (void)singleThread; (void)nbWorkers;
 #endif
 
-#ifdef UTIL_HAS_CREATEFILELIST
     g_utilDisplayLevel = g_displayLevel;
+
+#ifdef UTIL_HAS_CREATEFILELIST
     if (!followLinks) {
         unsigned u, fileNamesNb;
         unsigned const nbFilenames = (unsigned)filenames->tableSize;