https://issues.dlang.org/show_bug.cgi?id=20320
--- Comment #1 from berni44 <[email protected]> --- 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. --
