Printing floating point numbers
Yui Hosaka
hos at hos.ac
Fri Oct 25 14:51:33 UTC 2019
On Friday, 25 October 2019 at 06:53:38 UTC, berni44 wrote:
> On Thursday, 24 October 2019 at 20:48:02 UTC, Yui Hosaka wrote:
>> Do you have any idea for this issue?
>
> I added a bug report:
> https://issues.dlang.org/show_bug.cgi?id=20320
>
> Internally the conversation from the binary representation of
> the value to the printed one is done by a call to a C function
> called snprintf. Probably the error is inside of this function
> call. But it could also happen before. Maybe the internal
> representation of 0.016 is allready wrong.
>
> It would be helpful if you could run the following program and
> post the output:
>
> 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]);
> }
Thank you for forwarding the issues.
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
---
More information about the Digitalmars-d-learn
mailing list