aboutsummaryrefslogtreecommitdiff
path: root/src/stdlib/fpconv.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-10-13 12:21:51 -0400
committerBruce Hill <bruce@bruce-hill.com>2025-10-13 12:21:51 -0400
commit31b22c9b54d33a8ab55f9e1f46d13231c9e974e7 (patch)
tree54635b1410d227f6b68311912398f417818e4d95 /src/stdlib/fpconv.c
parent8d652387268ea6063e86a6a797c40da38b94be82 (diff)
Minor correctness fixes for fpconv
Diffstat (limited to 'src/stdlib/fpconv.c')
-rw-r--r--src/stdlib/fpconv.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/stdlib/fpconv.c b/src/stdlib/fpconv.c
index eaae959a..3ed87443 100644
--- a/src/stdlib/fpconv.c
+++ b/src/stdlib/fpconv.c
@@ -115,14 +115,14 @@ static Fp multiply(Fp *a, Fp *b) {
return fp;
}
-static void round_digit(char *digits, int ndigits, uint64_t delta, uint64_t rem, uint64_t kappa, uint64_t frac) {
+static void round_digit(char digits[18], int ndigits, uint64_t delta, uint64_t rem, uint64_t kappa, uint64_t frac) {
while (rem < frac && delta - rem >= kappa && (rem + kappa < frac || frac - rem > rem + kappa - frac)) {
digits[ndigits - 1]--;
rem += kappa;
}
}
-static int generate_digits(Fp *fp, Fp *upper, Fp *lower, char *digits, int *K) {
+static int generate_digits(Fp *fp, Fp *upper, Fp *lower, char digits[18], int *K) {
uint64_t wfrac = upper->frac - fp->frac;
uint64_t delta = upper->frac - lower->frac;
@@ -151,7 +151,7 @@ static int generate_digits(Fp *fp, Fp *upper, Fp *lower, char *digits, int *K) {
uint64_t tmp = (part1 << -one.exp) + part2;
if (tmp <= delta) {
*K += kappa;
- round_digit(digits, idx, delta, tmp, div << -one.exp, wfrac);
+ if (idx > 0) round_digit(digits, idx, delta, tmp, div << -one.exp, wfrac);
return idx;
}
}
@@ -180,7 +180,7 @@ static int generate_digits(Fp *fp, Fp *upper, Fp *lower, char *digits, int *K) {
}
}
-static int grisu2(double d, char *digits, int *K) {
+static int grisu2(double d, char digits[18], int *K) {
Fp w = build_fp(d);
Fp lower, upper;
@@ -203,7 +203,7 @@ static int grisu2(double d, char *digits, int *K) {
return generate_digits(&w, &upper, &lower, digits, K);
}
-static int emit_digits(char *digits, int ndigits, char *dest, int K, bool neg) {
+static int emit_digits(char digits[18], int ndigits, char *dest, int K, bool neg) {
int exp = absv(K + ndigits - 1);
int max_trailing_zeros = 7;
@@ -248,7 +248,7 @@ static int emit_digits(char *digits, int ndigits, char *dest, int K, bool neg) {
ndigits = minv(ndigits, 18 - neg);
int idx = 0;
- dest[idx++] = digits[0];
+ dest[idx++] = ndigits >= 1 ? digits[0] : '0';
if (ndigits > 1) {
dest[idx++] = '.';