gcc 11.1.0: printf("%.43f\n", 0x1.52f8a8e32e982p-140): printed value is incorrectly rounded

Corinna Vinschen vinschen@redhat.com
Thu Nov 4 12:24:42 GMT 2021


On Nov  4 00:26, Pavel M wrote:
> ---------- Forwarded message ---------
> From: Pavel M <pavel.morozkin@gmail.com>
> Date: Sat, 12 Jun 2021 at 23:45
> Subject: gcc 11.1.0: printf("%.43f\n", 0x1.52f8a8e32e982p-140): printed
> value is incorrectly rounded
> To: <cygwin@cygwin.com>
> 
> 
> Sample code (t903.c):
> #include <stdio.h>
> int main(void)
> {
>     printf("%.43f\n", 0x1.52f8a8e32e982p-140);
>     return 0;
> }
> 
> Invocations:
> # gcc on Windows 10 (Cygwin)
> $ gcc t903.c -Wall -Wextra -std=c11 -pedantic -Wfatal-errors && ./a.exe
> 0.0000000000000000000000000000000000000000010
> 
> $ gcc --version
> gcc (GCC) 11.1.0
> 
> # gcc on Linux
> $ gcc t903.c -Wall -Wextra -std=c11 -pedantic -Wfatal-errors && ./a.exe
> 0.0000000000000000000000000000000000000000009

Newlib's ldtoa implementation is lacking.  It's using an algorithm which
defines an upper bound of digits to return to the caller, and currently
the number of digits is retricted to 42.

I was able to raise the max number of digits to 1023 in Newlib's ldtoa,
and I'm going to push the patch in a bit.

However, a much better fix would be to switch to gdtoa, as the BSDs and
Mingw64 do.

Is anybody here willing to take a look and change Newlib to gdtoa?


Thanks,
Corinna



More information about the Newlib mailing list