[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