summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-04-21 15:33:47 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-04-21 15:33:47 +0200
commitdbbca3dbf3856938120071225a5e4c906d3177e8 (patch)
tree92553d3e7f7b882e093a267a0729b0d803baa362
parent37cde16ba2939cbc0d4624dcdf01099ae682743a (diff)
downloadquickjs-dbbca3dbf3856938120071225a5e4c906d3177e8.tar.gz
quickjs-dbbca3dbf3856938120071225a5e4c906d3177e8.zip
dtoa fix for minus zero
-rw-r--r--dtoa.c16
-rw-r--r--tests/test_builtin.js1
2 files changed, 6 insertions, 11 deletions
diff --git a/dtoa.c b/dtoa.c
index 0f6be25..ac1be8d 100644
--- a/dtoa.c
+++ b/dtoa.c
@@ -1147,6 +1147,9 @@ int js_dtoa(char *buf, double d, int radix, int n_digits, int flags,
P = n_digits + 1;
else
P = n_digits;
+ /* "-0" is displayed as "0" if JS_DTOA_MINUS_ZERO is not present */
+ if (sgn && (flags & JS_DTOA_MINUS_ZERO))
+ *q++ = '-';
goto output;
}
/* denormal number: convert to a normal number */
@@ -1156,6 +1159,8 @@ int js_dtoa(char *buf, double d, int radix, int n_digits, int flags,
} else {
m |= (uint64_t)1 << 52;
}
+ if (sgn)
+ *q++ = '-';
/* remove the bias */
e -= 1022;
/* d = 2^(e-53)*m */
@@ -1167,8 +1172,6 @@ int js_dtoa(char *buf, double d, int radix, int n_digits, int flags,
(flags & JS_DTOA_EXP_MASK) != JS_DTOA_EXP_ENABLED) {
m >>= 53 - e;
/* 'm' is never zero */
- if (sgn)
- *q++ = '-';
q += u64toa_radix(q, m, radix);
goto done;
}
@@ -1244,10 +1247,6 @@ int js_dtoa(char *buf, double d, int radix, int n_digits, int flags,
/* frac is rounded using RNDNA */
mul_pow_round(tmp1, m, e - 53, radix1, radix_shift, n_digits, JS_RNDNA);
- /* "-0" is displayed as "0" */
- if (sgn && !(tmp1->tab[0] == 0 && tmp1->len == 1)) {
- *q++ = '-';
- }
/* we add one extra digit on the left and remove it if needed
to avoid testing if the result is < radix^P */
len = output_digits(q, tmp1, radix, max_int(E + 1, 1) + n_digits,
@@ -1277,11 +1276,6 @@ int js_dtoa(char *buf, double d, int radix, int n_digits, int flags,
}
}
output:
- /* "-0" is displayed as "0" if JS_DTOA_MINUS_ZERO is not present */
- if (sgn && ((flags & JS_DTOA_MINUS_ZERO) ||
- !(tmp1->tab[0] == 0 && tmp1->len == 1))) {
- *q++ = '-';
- }
if (fmt == JS_DTOA_FORMAT_FIXED)
E_max = n_digits;
else
diff --git a/tests/test_builtin.js b/tests/test_builtin.js
index 2fd3c41..174f216 100644
--- a/tests/test_builtin.js
+++ b/tests/test_builtin.js
@@ -393,6 +393,7 @@ function test_number()
assert((-1.125).toFixed(2), "-1.13");
assert((0.5).toFixed(0), "1");
assert((-0.5).toFixed(0), "-1");
+ assert((-1e-10).toFixed(0), "-0");
assert((1.3).toString(7), "1.2046204620462046205");
assert((1.3).toString(35), "1.ahhhhhhhhhm");