Hi,
no big deal as the third singular value is still numerically zero compared to the largest one, and I'm pretty sure that you can build examples exhibiting the opposite behavior. For the record, the precise changes at the origin of this change of behavior are in the computation of the 2x2 SVD:
old:
RealScalar u = d / t;
rot1..c() = RealScalar(1) / sqrt(RealScalar(1) + numext::abs2(u));
rot1.s() = rot1.c() * u;
new:
RealScalar t2d2 = numext::hypot(t,d);
rot1.c() = abs(t)/t2d2;
rot1.s() = d/t2d2;
if(t<RealScalar(0))
rot1.s() = -rot1.s();
the old one is subject to underflow and overflow issues, and it does not pass our unit tests. I'm open to better suggestions for this portion of the code. Its purpose is to construct a rotation R such that R * M is symmetric (M being real and 2x2) with t and d as follows:
t = m(0,0) + m(1,1);
d = m(1,0) - m(0,1);
cheers,
gael