On Thursday, 11 January 2018 at 23:57:29 UTC, kdevel wrote:
What about the failed comparison:
gt.d
```
import std.stdio;
import decimal;
void loopme(T) ()
{
"---".writeln;
T e = 10;
while (e > 1e-6) {
e /= 10;
writeln (e, ' ', e > 1e-6);
}
}
void main ()
{
loopme!decimal32;
loopme!decimal64;
loopme!decimal128;
}
```
This gives here:
---
1 true
0.1 false
---
1 true
0.1 false
---
1 true
0.1 true
0.0100000 true
0.00100000 true
0.000100000 true
1.00000e-05 true
1.00000e-06 true
1.00000e-07 false
This is not failed comparison. 1e-6 cannnot be represented
exactly as binary floating point, it is in fact
0.00000099999999999999995481 as double which happens to be less
than 1e-6.
decimal32 and decimal64 are rounding up the value, decimal128 has
enough precision (34 digits) to render exactly the value above.
writefln(" 7 digits: %#.7f", 1e-6);
writefln("15 digits: %#.15f", 1e-6);
writefln("34 digits: %#.34f", 1e-6);
-----
7 digits: 0.0000010
15 digits: 0.000001000000000
34 digits: 0.0000009999999999999999548100000000