On 8/25/15 11:56 AM, "Ola Fosheim =?UTF-8?B?R3LDuHN0YWQi?= <ola.fosheim.grostad+dl...@gmail.com>" wrote:
On Tuesday, 25 August 2015 at 14:54:41 UTC, Steven Schveighoffer wrote:
As bachmeier says, it's not something that's easy to get right.

Are you sure you follow IEEE 754 recommendations? Floating point
arithmetics should be reproducible according to the chosen rounding mode.

https://en.wikipedia.org/wiki/IEEE_floating_point#Reproducibility

«The reproducibility clause recommends that language standards should
provide a means to write reproducible programs (i.e., programs that will
produce the same result in all implementations of a language), and
describes what needs to be done to achieve reproducible results.»


I'm not an expert on floating point, but I have written code that uses it, and I have gotten it very wrong because I didn't take into account the floating point error (worst was causing an infinite loop in a corner case).

I'll note that D does exactly what C does in the case where you are using 80-bit floating point numbers.

There is definitely an issue with the fact that storing it as a double causes a change in the behavior, and that D doesn't treat expressions that are typed as doubles, as doubles.

I see an issue with this:

double x = 1.2;

auto y = x * 10.0; // typed as double
writefln("%s %s", cast(ulong)y, cast(ulong)(x * 10.0)); // 12 11

IMO, these two operations should be the same. If the result of an expression is detected to be double, then it should behave like one. You can't have the calculation done in 80-bit mode, and then magically throw away the rounding to get to 64-bit mode.

I think Marcio has a point that this is both surprising and troublesome. But I think this is an anecdotal instance of a toy example. I'd expect real code to use adjustments when truncating to avoid the FP error (this obviously isn't his real code).

-Steve

Reply via email to