logo

utils-std

Collection of commonly available Unix tools git clone https://anongit.hacktivis.me/git/utils-std.git/
commit: 6df1ded74623e8f68dd28fdd7ed26ee502e82640
parent 6dee172499f83b50233873de2e9c5e54fc06c4bc
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date:   Wed, 16 Apr 2025 16:02:13 +0200

lib/humanize: fix off-by-one for max prefix

Diffstat:

Mlib/humanize.c2+-
Mtest-lib/t_humanize.c18+++++++++++++++---
2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/lib/humanize.c b/lib/humanize.c @@ -27,7 +27,7 @@ dtosi(double num, bool iec) .exponent = 0, }; - while(ret.number > div && ret.exponent < PFX) + while(ret.number > div && ret.exponent < (PFX - 1)) { ret.number /= div; ret.exponent += 1; diff --git a/test-lib/t_humanize.c b/test-lib/t_humanize.c @@ -21,7 +21,7 @@ t_dtosi(double in, bool iec, double out, unsigned exponent) if(ret.number == out && ret.exponent == exponent) { - printf("ok %d - dtosi(%g, %d) => {.number = %g, .exponent = %d}\n", + printf("ok %d - dtosi(%f, %d) => {.number = %g, .exponent = %d}\n", id, in, iec, @@ -31,7 +31,7 @@ t_dtosi(double in, bool iec, double out, unsigned exponent) } err = 1; - printf("not ok %d - dtosi(%g, %d) => {.number = %g, .exponent = %d}\n", + printf("not ok %d - dtosi(%f, %d) => {.number = %g, .exponent = %d}\n", id, in, iec, @@ -43,7 +43,7 @@ t_dtosi(double in, bool iec, double out, unsigned exponent) int main(void) { - int plan = 10; + int plan = 18; printf("1..%d\n", plan); t_dtosi(0, false, 0, 0); @@ -61,6 +61,18 @@ main(void) t_dtosi(-1024, true, -1024, 0); t_dtosi(-10240, true, -10240 / 1024, 1); +#define IEC_QiB 1267650600228229401496703205376.0 /* 1024^10 */ + t_dtosi(1024 * IEC_QiB, true, 1024, 10); + t_dtosi(-1024 * IEC_QiB, true, -1024, 10); + t_dtosi(1024 * 1024 * IEC_QiB, true, 1024 * 1024, 10); + t_dtosi(-1024 * 1024 * IEC_QiB, true, -1024 * 1024, 10); + +#define SI_Q 1000000000000000000000000000000.0 /* 1000^10 */ + t_dtosi(1000 * SI_Q, false, 1000, 10); + t_dtosi(-1000 * SI_Q, false, -1000, 10); + t_dtosi(1000 * 1000 * SI_Q, false, 1000 * 1000, 10); + t_dtosi(-1000 * 1000 * SI_Q, false, -1000 * 1000, 10); + assert(counter == plan); return err; }