Thread overview
[Issue 20320] format("%f") leeds to wrong output
Oct 25
berni44
Oct 25
kinke
4 days ago
berni44
2 days ago
Dlang Bot
October 25
https://issues.dlang.org/show_bug.cgi?id=20320

--- Comment #1 from berni44 <bugzilla@d-ecke.de> ---
Some more debug information (from Yui Hosaka):

import std.stdio;
import std.format;
void main()
{
    real b = 0.016;
    writefln!"%.2f"(b);
    foreach (c;format("%r",b)) writef("%x ",c);
    writeln();

    char[6] sprintfSpec = "%*.*Lf";
    char[512] buf = void;
    import core.stdc.stdio : snprintf;
    immutable n = snprintf(buf.ptr, buf.length, sprintfSpec.ptr, 0, 2, b);
    writeln(buf[0..n]);
}

The outputs for your program are as follows:

Without compiler options (32-bit):
---
0.01
3b df 4f 8d 97 6e 12 83 f9 3f
0.01
---
and some trailing characters. "./a | od -c" shows:
---
0000000   0   .   0   1  \r  \n   3   b       d   f       4   f
    8
0000020   d       9   7       6   e       1   2       8   3       f   9
0000040       3   f      \r  \n   0   .   0   1 377 377 206 003  \r  \n
0000060
---

With "-O" (32-bit), the output changes in every run, such as:
---
0.01
3b df 4f 8d 97 6e 12 83 f9 3f
0.01S
---
0.01
3b df 4f 8d 97 6e 12 83 f9 3f
0.01b
---
0.01
3b df 4f 8d 97 6e 12 83 f9 3f
0.01c
---

With "-m64" or "-m64 -O":
---
0.02
3b df 4f 8d 97 6e 12 83 f9 3f
0.00
---

For me, this looks like the error is to be found inside snprintf. The "0.00" in the last run is strange.

--
October 25
https://issues.dlang.org/show_bug.cgi?id=20320

kinke <kinke@gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kinke@gmx.net

--- Comment #2 from kinke <kinke@gmx.net> ---
Microsoft's snprintf doesn't support 80-bit real, as Microsoft's `long double` is a 64-bit double. So snprintf can't be used on Windows with -m64 and -m32mscoff. No idea about DigitalMars' snprintf.

--
4 days ago
https://issues.dlang.org/show_bug.cgi?id=20320

--- Comment #3 from berni44 <bugzilla@d-ecke.de> ---
I meanwhile was able to reproduce this in PR #7264 (https://github.com/dlang/phobos/pull/7264). This PR fixes this for float and double but not real.

--
2 days ago
https://issues.dlang.org/show_bug.cgi?id=20320

--- Comment #4 from Dlang Bot <dlang-bot@dlang.rocks> ---
@berni44 updated dlang/phobos pull request #7264 "Partial replace call to snprintf for formating floatingpoint numbers." mentioning this issue:

- Fix partially Issue 20320 - format("%f") leeds to wrong output

https://github.com/dlang/phobos/pull/7264

--