mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Add a portable log2 function for integers
This commit is contained in:
parent
0f0580b97c
commit
fc23e93707
@ -694,6 +694,21 @@ bool (isfinite)(const std::complex<T>& x)
|
|||||||
return isfinite(real(x)) && isfinite(imag(x));
|
return isfinite(real(x)) && isfinite(imag(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Log base 2 for 32 bits positive integers.
|
||||||
|
// Conveniently returns 0 for x==0.
|
||||||
|
int log2(int x)
|
||||||
|
{
|
||||||
|
eigen_assert(x>=0);
|
||||||
|
unsigned int v(x);
|
||||||
|
static const int table[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
|
||||||
|
v |= v >> 1;
|
||||||
|
v |= v >> 2;
|
||||||
|
v |= v >> 4;
|
||||||
|
v |= v >> 8;
|
||||||
|
v |= v >> 16;
|
||||||
|
return table[(v * 0x07C4ACDDU) >> 27];
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace numext
|
} // end namespace numext
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
@ -101,7 +101,7 @@ static void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& r
|
|||||||
// otherwise => loop through the entire vector
|
// otherwise => loop through the entire vector
|
||||||
// In order to avoid to perform an expensive log2 when the
|
// In order to avoid to perform an expensive log2 when the
|
||||||
// result is clearly very sparse we use a linear bound up to 200.
|
// result is clearly very sparse we use a linear bound up to 200.
|
||||||
if((nnz<200 && nnz<t200) || nnz * log2(nnz) < t)
|
if((nnz<200 && nnz<t200) || nnz * numext::log2(int(nnz)) < t)
|
||||||
{
|
{
|
||||||
if(nnz>1) std::sort(indices,indices+nnz);
|
if(nnz>1) std::sort(indices,indices+nnz);
|
||||||
for(Index k=0; k<nnz; ++k)
|
for(Index k=0; k<nnz; ++k)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user