Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250701142223.GA1827@brightrain.aerifal.cx>
Date: Tue, 1 Jul 2025 10:22:25 -0400
From: Rich Felker <dalias@...c.org>
To: Michal Terepeta <michalt@...gle.com>
Cc: musl@...ts.openwall.com, t5y-external <t5y-external@...gle.com>
Subject: Re: Wrong formatting of doubles?

On Tue, Jul 01, 2025 at 07:55:20AM +0200, Michal Terepeta wrote:
> Hi,
> 
> We're working on a RISC-V system and using musl as our libc. A recent change
> in musl seems to have caused wrong formatting (printf) of double values:
> https://git.musl-libc.org/cgit/musl/commit/src/stdio/vfprintf.c?id=572a2e2eb91f00f2f25d301cfb50f435e7ae16b3
> 
> Using a simple binary to print max double [1] with the current code I get:
> 
> ```
> The maximum value of a double (printf %e): 1.348676e+308
> The maximum value of a double (printf %E): 1.348676E+308
> The maximum value of a double (printf %g): 3.13486e+308
> ```
> 
> With the patch [2] that reverts most of the above change, I get the expected
> output:
> 
> ```
> The maximum value of a double (printf %e): 1.797693e+308
> The maximum value of a double (printf %E): 1.797693E+308
> The maximum value of a double (printf %g): 1.79769e+308
> ```
> 
> It'd be great if someone could take a look if they can also repro and perhaps
> revert the change?
> 
> Many thanks!
> 
> Michal
> 
> 
> 
> [1] Repro program:
> 
> ```
> #include <float.h>
> #include <stdio.h>
> 
> int main() {
>   printf("The maximum value of a double (printf %%e): %e\n", DBL_MAX);
>   printf("The maximum value of a double (printf %%E): %E\n", DBL_MAX);
>   printf("The maximum value of a double (printf %%g): %g\n", DBL_MAX);
>   return 0;
> }
> 
> ```
> 
> 
> [2] Patch to test:
> 
> ```
> diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
> index 010041ca6c..01004158bf 100644
> --- a/src/stdio/vfprintf.c
> +++ b/src/stdio/vfprintf.c
> @@ -180,12 +180,8 @@
> 
>  static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t, int ps)
>  {
> -       int bufsize = (ps==BIGLPRE)
> -               ? (LDBL_MANT_DIG+28)/29 + 1 +          // mantissa expansion
> -                 (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9  // exponent expansion
> -               : (DBL_MANT_DIG+28)/29 + 1 +
> -                 (DBL_MAX_EXP+DBL_MANT_DIG+28+8)/9;
> -       uint32_t big[bufsize];
> +       uint32_t big[(LDBL_MANT_DIG+28)/29 + 1          // mantissa expansion
> +               + (LDBL_MAX_EXP+LDBL_MANT_DIG+28+8)/9]; // exponent expansion
>         uint32_t *a, *d, *r, *z;
>         int e2=0, e, i, j, l;
>         char buf[9+LDBL_MANT_DIG/4], *s;
> ```

Could you try the attached patch?


View attachment "printf_dbl_bug.diff" of type "text/plain" (1208 bytes)

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.