]> git.kaiwu.me - quickjs.git/commitdiff
dtoa fix for minus zero
authorFabrice Bellard <fabrice@bellard.org>
Mon, 21 Apr 2025 13:33:47 +0000 (15:33 +0200)
committerFabrice Bellard <fabrice@bellard.org>
Mon, 21 Apr 2025 13:33:47 +0000 (15:33 +0200)
dtoa.c
tests/test_builtin.js

diff --git a/dtoa.c b/dtoa.c
index 0f6be2545decefcb41a4d2252fbf530c328e9e1a..ac1be8d8e1a49a5f088acc1f74728f172e74a447 100644 (file)
--- 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
index 2fd3c419490c42cd8d493e2d4209adb31c5b2e6b..174f21607c363ac07a933feee501502ee85fa25c 100644 (file)
@@ -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");