1018
2015-05-20 12:53:53 +0000
blueNorm handles complex infinities wrong on some systems
2019-12-04 14:39:12 +0000
1
1
1
Unclassified
Eigen
Core - general
3.3 (current stable)
All
All
CONFIRMED
Normal
Wrong Result
---
1019
1
chtz
eigen.nobody
chtz
gael.guennebaud
jacob.benoit.1
oldest_to_newest
4709
0
chtz
2015-05-20 12:53:53 +0000
This results in the stable_norm_5 unit test to fail on several systems (mostly clang, but I experienced it on g++4.9-cygwin, as well)
The problem is that sometimes abs for complex is implemented similar to this:
template<typename _Tp>
inline _Tp
__complex_abs(const complex<_Tp>& __z)
{
_Tp __x = __z.real();
_Tp __y = __z.imag();
const _Tp __s = std::max(abs(__x), abs(__y));
if (__s == _Tp()) // well ...
return __s;
__x /= __s;
__y /= __s;
return __s * sqrt(__x * __x + __y * __y);
}
This causes a division of Inf/Inf which results in NaN instead of Inf (which is a bug not caused by us). Nevertheless, even for working abs implementations, we could (actually for all *Norm implementations) increase stability and improve performance by computing the norm of a real-valued vector of twice the size (at least for Euclidean norm).
Related to that: Some of our decompositions (e.g. eigenvalue/svd) normalize the input matrix by dividing by .cwiseAbs().maxCoeff(). IMO it would make sense here to take use the max of (real().cwiseAbs(), imag().cwiseAbs()) here as well (no, need to compute any complex abs)
4715
1
gael.guennebaud
2015-06-05 13:03:56 +0000
Agree with both proposals.
9462
2
eigen.nobody
2019-12-04 14:39:12 +0000
-- GitLab Migration Automatic Message --
This bug has been migrated to gitlab.com's GitLab instance and has been closed from further activity.
You can subscribe and participate further through the new bug through this link to our GitLab instance: https://gitlab.com/libeigen/eigen/issues/1018.