[Issue 20320] format("%f") leeds to wrong output

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Oct 25 16:22:19 UTC 2019


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

--- Comment #1 from berni44 <bugzilla at 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.

--


More information about the Digitalmars-d-bugs mailing list