[eigen] Failing basicstuff_3 test |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
Hello,
The basicstuff_3 test is failing on my computer (32-bits, gcc 4.1 and 4.3,
both with and without SSE). However, it works fine on Gael's computer.
The offending code is (with Scalar = complex<float> ):
Scalar s1 = ei_random<Scalar>(),
s2 = ei_random<Scalar>();
VERIFY(ei_real(s1)==ei_real_ref(s1));
VERIFY(ei_imag(s1)==ei_imag_ref(s1));
ei_real_ref(s1) = ei_real(s2);
ei_imag_ref(s1) = ei_imag(s2);
VERIFY(s1==s2);
The last VERIFY fails. The bug is very finicky; changing almost anything
and it goes fine. This is the best I could simplify it too:
complex<float> s1 = complex<float>(1.5,1.5);
complex<float> s2 = ei_random<complex<float> >();
VERIFY(jn_imag(s1)==jn_imag_ref(s1));
jn_real_ref(s1) = jn_real(s2);
jn_imag_ref(s1) = jn_imag(s2);
if (s1!=s2) {
std::cerr << s1-s2 << std::endl;
std::cerr << "Test failed!" << std::endl;
}
Leaving out either the call to ei_random or the VERIFY and the bug goes
away. When compiled with -O1 or higher, the test fails with s1-s2 =
(-5.587935448e-09,2.328306437e-08); when compiled without optimization the
test passes. What's interesting is that s1-s2 is so small. In fact, if I
print s2, I find that s2 = (-0.2112341523,0.6803754568), which means that
the difference is smaller than the distance between two single-precision
floating point numbers.
I guess that means that the bug has to do with the extended precision of
the FPU. So, what to do now?
Is there any way to check my guess? I guess definite proof comes from the
generated assemble. I looked at the assembly (not something I know well),
and it is full of Fxxx instructions, so it does use the FPU. However, it
is rather more complicated that I'd have expected (there are FMUL in
there), so it would take a lot of time for me to understand it. Any
shortcuts I could take? Is it possible to force the FPU not to use
extended precision?
If the failing test is indeed caused by the extended precision, then it's
not a bug and we should rewrite the test. Correct?
Jitse