From dbbca3dbf3856938120071225a5e4c906d3177e8 Mon Sep 17 00:00:00 2001 From: Fabrice Bellard Date: Mon, 21 Apr 2025 15:33:47 +0200 Subject: [PATCH] dtoa fix for minus zero --- dtoa.c | 16 +++++----------- tests/test_builtin.js | 1 + 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");