[Issue 13474] New: 32 bit DMD optimizer FP arithmetic bug
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Sun Sep 14 06:22:18 PDT 2014
https://issues.dlang.org/show_bug.cgi?id=13474
Issue ID: 13474
Summary: 32 bit DMD optimizer FP arithmetic bug
Product: D
Version: D2
Hardware: x86
OS: All
Status: NEW
Severity: critical
Priority: P1
Component: DMD
Assignee: nobody at puremagic.com
Reporter: ilyayaroshenko at gmail.com
KBN summation return wrong result when compiled with
dmd -m32 -O
With -m64 dmd works correctly
LDC works correctly both m32 and m64
+++++++++++++++++++++++++++++++++
/**
Kahan-Babuška-Neumaier summation algorithm
+++++++++
s := x[1]
c := 0
FOR i := 2 TO n DO
t := s + x[i]
IF ABS(s) >= ABS(x[i]) THEN
c := c + ((s-t)+x[i])
ELSE
c := c + ((x[i]-t)+s)
END IF
s := t
END DO
s := s + c
+++++++++
*/
F sumKBN(Range, F = Unqual!(ForeachType!Range))(Range r, F s = 0.0)
{
F c = 0.0;
foreach(F x; r)
{
F t = s + x;
if(s.fabs >= x.fabs)
{
F y = s-t;
c += y+x;
}
else
{
F y = x-t;
c += y+s;
}
s = t;
}
return s + c;
}
unittest
{
import std.algorithm : map;
auto ar = [1, 1e100, 1, -1e100].map!(a => a*10000);
double r = 20000;
assert(r == ar.sumKBN); // fails with dmd -m32 -O
}
+++++++++++++++++++++++++++++++++
Git Reference: https://github.com/D-Programming-Language/phobos/pull/2513
--
More information about the Digitalmars-d-bugs
mailing list