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