On Thursday, 17 December 2015 at 11:58:35 UTC, drug wrote:
On 17.12.2015 14:52, Andrea Fontana wrote:
You should publish some code to check...
Too much code to public - operations are simple, but there are
many branches and reducing may take much time . In fact I asked
to understand _in general_ if it worth diving into code to find
the source of the difference or take it easy and go on...
If D and C++ use the same things to process float types then it
worth to dive, but if there is some issues, then it doesn't.
Yes the float types are the same. floats doubles are identical
long double == real ( at least for x86)
The only difference is that float are default initialised to NaN
in D.
The sources of difference are likely to occur from
- const folding (varying by compiler e.g. gcc uses libgmp for
high precision floating point for constant folding where as other
compliers may not)
- type promotions and truncations
I.e.
double a = ... ,b = ... ;
float c = a+b;
float d = cast(float)a + cast(float)b;
c is unlikely to be bit for bit equal to d.
floating point operations are NOT commutative nor are they
distributive. Order of operations does matter.
i.e. a+(b+c) !=(a+b) +c and a*(b+c) != a*b + a*c (!= means not
necessarily equal)
you should always compare floats for equality with an epsilon
(unless 0.0 +-inf )