Bug 20320 – format("%f") leeds to wrong output

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P1
Component
phobos
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2019-10-25T06:27:10Z
Last change time
2021-04-12T07:25:28Z
Keywords
pull
Assigned to
No Owner
Creator
berni44

Comments

Comment #0 by bugzilla — 2019-10-25T06:27:10Z
import std.stdio; void main() { real a = 0.16; real b = 0.016; writefln("%.1f", a); writefln("%.2f", b); } ---- Output: --- 0.2 0.01 ---- I am using dmd on Windows. It doesn't happen when compiling with -m32. ---- $ dmd DMD32 D Compiler v2.088.1-dirty Reported by Yui Hosaka in the forum: https://forum.dlang.org/post/[email protected]
Comment #1 by bugzilla — 2019-10-25T16:22:19Z
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.
Comment #2 by kinke — 2019-10-25T16:50:57Z
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.
Comment #3 by bugzilla — 2019-11-08T15:35:35Z
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.
Comment #4 by dlang-bot — 2019-11-10T09:17:47Z
@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
Comment #5 by dlang-bot — 2021-01-20T17:41:53Z
@berni44 created dlang/phobos pull request #7757 "Partial replace call to snprintf for formating floatingpoint numbers for %f and %F" mentioning this issue: - Fix partially Issue 20320 - format("%f") leeds to wrong output https://github.com/dlang/phobos/pull/7757
Comment #6 by dlang-bot — 2021-02-15T11:01:00Z
dlang/phobos pull request #7757 "Partial replace call to snprintf for formating floatingpoint numbers for %f and %F" was merged into master: - 782780a3967873af468809445a4d7809a2d925c7 by Bernhard Seckinger: Fix partially Issue 20320 - format("%f") leeds to wrong output https://github.com/dlang/phobos/pull/7757
Comment #7 by dlang-bot — 2021-04-11T10:17:42Z
@berni44 created dlang/phobos pull request #7951 "std.format: Replace snprintf for x87-reals" fixing this issue: - Fix Issue 20320 - format("%f") leeds to wrong output https://github.com/dlang/phobos/pull/7951
Comment #8 by dlang-bot — 2021-04-12T07:25:28Z
dlang/phobos pull request #7951 "std.format: Replace snprintf for x87-reals" was merged into master: - 23e5c9e15086c87f9160a0b594132eb60b338bb2 by berni44: Fix Issue 20320 - format("%f") leeds to wrong output https://github.com/dlang/phobos/pull/7951