[lvm-devel] master - libdm: implement dm_percent_to_round_float

Zdenek Kabelac zkabelac at sourceware.org
Sat Jun 24 15:59:40 UTC 2017


Gitweb:        https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=2ef8da61eb968acb3c5c51cdfdc997e8bed90352
Commit:        2ef8da61eb968acb3c5c51cdfdc997e8bed90352
Parent:        0016b79c8b3223de7155fb4ec5fa799f7af1c811
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Sat Jun 24 13:24:26 2017 +0200
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Sat Jun 24 17:44:40 2017 +0200

libdm: implement dm_percent_to_round_float

Add function to adjust printing of percent values in better way.
Rounding here is going along following rules:

0% & 100% are always clearly reported with  .0 decimal points.

Values slightly above 0% we make sure a nearest bigger
non zero value with given precission is printed
(i.e. 0.01  for  %.2f  will be shown)

For values closely approaching 100% we again detect and adjust value
that is less then 100 when printed.
(i.e. 99.99  for %.2f will be shown).

For other values we are leaving them with standard rounding mechanism
since we care mainly about corner values 0 & 100 which need to be
printed precisely.
---
 WHATS_NEW_DM                        |    1 +
 libdm/.exported_symbols.DM_1_02_141 |    1 +
 libdm/libdevmapper.h                |   10 ++++++++++
 libdm/libdm-report.c                |   23 +++++++++++++++++++++++
 4 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 83df7cc..89f4a00 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,5 +1,6 @@
 Version 1.02.141 - 
 ===============================
+  Add dm_percent_to_round_float for adjusted percentage rounding.
   Reset array with dead rimage devices once raid gets in sync.
   Drop unneeded --config option from raid dmeventd plugin.
   dm_get_status_raid() handle better some incosistent md statuses.
diff --git a/libdm/.exported_symbols.DM_1_02_141 b/libdm/.exported_symbols.DM_1_02_141
new file mode 100644
index 0000000..8187642
--- /dev/null
+++ b/libdm/.exported_symbols.DM_1_02_141
@@ -0,0 +1 @@
+dm_percent_to_round_float
diff --git a/libdm/libdevmapper.h b/libdm/libdevmapper.h
index 4bd32b4..5e77906 100644
--- a/libdm/libdevmapper.h
+++ b/libdm/libdevmapper.h
@@ -2836,6 +2836,16 @@ typedef enum {
 typedef int32_t dm_percent_t;
 
 float dm_percent_to_float(dm_percent_t percent);
+/*
+ * Return adjusted/rounded float for better percent value printing.
+ * Function ensures for given precision of digits:
+ * 100.0% returns only when the value is DM_PERCENT_100
+ *        for close smaller values rounds to nearest smaller value
+ * 0.0% returns only for value DM_PERCENT_0
+ *        for close bigger values rounds to nearest bigger value
+ * In all other cases returns same value as dm_percent_to_float()
+ */
+float dm_percent_to_round_float(dm_percent_t percent, unsigned digits);
 dm_percent_t dm_make_percent(uint64_t numerator, uint64_t denominator);
 
 /********************
diff --git a/libdm/libdm-report.c b/libdm/libdm-report.c
index 7caba98..0a5d464 100644
--- a/libdm/libdm-report.c
+++ b/libdm/libdm-report.c
@@ -2425,6 +2425,29 @@ float dm_percent_to_float(dm_percent_t percent)
 	return (float) percent / DM_PERCENT_1 + 0.f;
 }
 
+float dm_percent_to_round_float(dm_percent_t percent, unsigned digits)
+{
+	static const float power10[] = {
+		1.f, .1f, .01f, .001f, .0001f, .00001f, .000001f,
+		.0000001f, .00000001f, .000000001f,
+		.0000000001f
+	};
+	float r;
+	float f = dm_percent_to_float(percent);
+
+	if (digits >= DM_ARRAY_SIZE(power10))
+		digits = DM_ARRAY_SIZE(power10) - 1; /* no better precision */
+
+	r = DM_PERCENT_1 * power10[digits];
+
+	if ((percent < r) && (percent > DM_PERCENT_0))
+		f = power10[digits];
+	else if ((percent > (DM_PERCENT_100 - r)) && (percent < DM_PERCENT_100))
+		f = (float) (DM_PERCENT_100 - r) / DM_PERCENT_1;
+
+	return f;
+}
+
 dm_percent_t dm_make_percent(uint64_t numerator, uint64_t denominator)
 {
 	dm_percent_t percent;




More information about the lvm-devel mailing list