Floating-Point arithmetic in dlang - Difference to other languages
H. S. Teoh
hsteoh at quickfur.ath.cx
Tue Dec 3 18:45:42 UTC 2019
On Tue, Dec 03, 2019 at 09:22:49AM +0000, Jan Hönig via Digitalmars-d-learn wrote:
> Today i have stumbled on Hacker News into: https://0.30000000000000004.com/
>
> I am learning D, that's why i have to ask.
>
> Why does
>
> writefln("%.17f", .1+.2);
>
> not evaluate into: 0.30000000000000004, like C++
> but rather to: 0.29999999999999999
>
> Many other languages evaluate to 0.30000000000000004 as well.
In short, because they use 64-bit floats for intermediate values
(`double`), whereas D defaults to 80-bit intermediates (`real`).
The use of a more precise intermediate value is also indicated by the
fact that 0.29999999999999999 is closer to the real answer (error of
1e-17) than 0.30000000000000004 (error of 4e-17).
If you explicitly specify to use `double`, then you should get the same
answer as C++.
double a=.1, b=.2;
writefln("%.17f", a+b);
T
--
MSDOS = MicroSoft's Denial Of Service
More information about the Digitalmars-d-learn
mailing list