October 15 [Issue 24819] New: Optimizer changes result of float calculations on 32-bit | ||||
---|---|---|---|---|
| ||||
https://issues.dlang.org/show_bug.cgi?id=24819 Issue ID: 24819 Summary: Optimizer changes result of float calculations on 32-bit Product: D Version: D2 Hardware: x86 OS: Windows Status: NEW Keywords: backend, industry Severity: major Priority: P3 Component: dmd Assignee: nobody@puremagic.com Reporter: dkorpel@live.nl On 32-bit, dmd's optimizer produces a different result for the following code: ``` void main() { double[4] y; cubic_roots(-3.016658e-04, 1.042930e-02, 1.427929e-01, -2.600958e-02, y); writeln(y[1 .. $]); } void cubic_roots(double a, double b, double c, double d, ref double[4] x) { immutable ovfl = 1E+6; immutable half = 0.5; immutable e3 = 0.3333333333333; immutable pi3 = 1.04719755; int i, z; double a1, b1, c1, df, disc, d1, f, p3, q, r, step, u, u2, y, ay; a1 = abs(a); b1 = abs(b); c1 = abs(c); d1 = abs(d); if (max(max(b1, c1), d1) < a1 * ovfl) { b1 = b / a * e3; c1 = c / a; d1 = d / a; q = c1 * e3 - (b1) ^^ 2; r = (b1) ^^ 2 * b1 + (d1 - b1 * c1) * half; disc = (q) ^^ 2 * q + (r) ^^ 2; if (disc <= 0) { u = sqrt(abs(q)); if (r < 0) u = -u; if (r != 0) { p3 = atan(sqrt(-disc) / abs(r)) * e3; u2 = u + u; x[1] = -u2 * cos(p3) - b1; x[2] = u2 * cos(pi3 - p3) - b1; x[3] = u2 * cos(pi3 + p3) - b1; } } } for ({z = 1; immutable max_z_expression = 3; } z <= max_z_expression; z++) for ({i = 1; immutable max_i_expression = 3; } i <= max_i_expression; i++) { y = x[i]; ay = a * y; f = ((ay + b) * y + c) * y + d; df = (3 * ay + 2 * b) * y + c; step = 0; x[i] = y - step; } } ``` Expected result: [45.0395, -10.6469, 0.1798] Actual result (with dmd -m32 -O): [45.6174, -5.52252, -5.52252] I'll reduce it further later. -- |
Copyright © 1999-2021 by the D Language Foundation