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:
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;
}