mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-09-13 09:53:13 +08:00
Fixed a bug in the integer division code that caused some large numerators to be incorrectly handled
This commit is contained in:
parent
ea87561564
commit
3912ca0d53
@ -62,8 +62,11 @@ struct TensorIntDivisor {
|
|||||||
|
|
||||||
// fast ln2
|
// fast ln2
|
||||||
const int leading_zeros = count_leading_zeros(divider);
|
const int leading_zeros = count_leading_zeros(divider);
|
||||||
const int log_div = N - (leading_zeros+1);
|
int log_div = N - leading_zeros;
|
||||||
|
// If divider is a power of two then log_div is 1 more than it should be.
|
||||||
|
if ((1ull << (log_div-1)) == divider) {
|
||||||
|
log_div--;
|
||||||
|
}
|
||||||
multiplier = (static_cast<uint64_t>(1) << (N+log_div)) / divider - (static_cast<uint64_t>(1) << N) + 1;
|
multiplier = (static_cast<uint64_t>(1) << (N+log_div)) / divider - (static_cast<uint64_t>(1) << N) + 1;
|
||||||
shift1 = log_div > 1 ? 1 : log_div;
|
shift1 = log_div > 1 ? 1 : log_div;
|
||||||
shift2 = log_div > 1 ? log_div-1 : 0;
|
shift2 = log_div > 1 ? log_div-1 : 0;
|
||||||
|
@ -31,12 +31,20 @@ static void test_1d()
|
|||||||
vec1(4) = 23.0; vec2(4) = 4.0;
|
vec1(4) = 23.0; vec2(4) = 4.0;
|
||||||
vec1(5) = 42.0; vec2(5) = 5.0;
|
vec1(5) = 42.0; vec2(5) = 5.0;
|
||||||
|
|
||||||
float data3[6];
|
// Test against shallow copy.
|
||||||
TensorMap<TensorFixedSize<float, Sizes<6> > > vec3(data3, 6);
|
TensorFixedSize<float, Sizes<6> > copy = vec1;
|
||||||
vec3 = vec1.sqrt();
|
VERIFY_IS_NOT_EQUAL(vec1.data(), copy.data());
|
||||||
float data4[6];
|
for (int i = 0; i < 6; ++i) {
|
||||||
TensorMap<TensorFixedSize<float, Sizes<6>, RowMajor> > vec4(data4, 6);
|
VERIFY_IS_APPROX(vec1(i), copy(i));
|
||||||
vec4 = vec2.sqrt();
|
}
|
||||||
|
copy = vec1;
|
||||||
|
VERIFY_IS_NOT_EQUAL(vec1.data(), copy.data());
|
||||||
|
for (int i = 0; i < 6; ++i) {
|
||||||
|
VERIFY_IS_APPROX(vec1(i), copy(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
TensorFixedSize<float, Sizes<6> > vec3 = vec1.sqrt();
|
||||||
|
TensorFixedSize<float, Sizes<6>, RowMajor> vec4 = vec2.sqrt();
|
||||||
|
|
||||||
VERIFY_IS_EQUAL((vec3.size()), 6);
|
VERIFY_IS_EQUAL((vec3.size()), 6);
|
||||||
VERIFY_IS_EQUAL(vec3.rank(), 1);
|
VERIFY_IS_EQUAL(vec3.rank(), 1);
|
||||||
@ -66,6 +74,30 @@ static void test_1d()
|
|||||||
VERIFY_IS_APPROX(vec3(5), 42.0f + 5.0f);
|
VERIFY_IS_APPROX(vec3(5), 42.0f + 5.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_tensor_map()
|
||||||
|
{
|
||||||
|
TensorFixedSize<float, Sizes<6> > vec1;
|
||||||
|
TensorFixedSize<float, Sizes<6>, RowMajor> vec2;
|
||||||
|
|
||||||
|
vec1(0) = 4.0; vec2(0) = 0.0;
|
||||||
|
vec1(1) = 8.0; vec2(1) = 1.0;
|
||||||
|
vec1(2) = 15.0; vec2(2) = 2.0;
|
||||||
|
vec1(3) = 16.0; vec2(3) = 3.0;
|
||||||
|
vec1(4) = 23.0; vec2(4) = 4.0;
|
||||||
|
vec1(5) = 42.0; vec2(5) = 5.0;
|
||||||
|
|
||||||
|
float data3[6];
|
||||||
|
TensorMap<TensorFixedSize<float, Sizes<6> > > vec3(data3, 6);
|
||||||
|
vec3 = vec1.sqrt() + vec2;
|
||||||
|
|
||||||
|
VERIFY_IS_APPROX(vec3(0), sqrtf(4.0));
|
||||||
|
VERIFY_IS_APPROX(vec3(1), sqrtf(8.0) + 1.0f);
|
||||||
|
VERIFY_IS_APPROX(vec3(2), sqrtf(15.0) + 2.0f);
|
||||||
|
VERIFY_IS_APPROX(vec3(3), sqrtf(16.0) + 3.0f);
|
||||||
|
VERIFY_IS_APPROX(vec3(4), sqrtf(23.0) + 4.0f);
|
||||||
|
VERIFY_IS_APPROX(vec3(5), sqrtf(42.0) + 5.0f);
|
||||||
|
}
|
||||||
|
|
||||||
static void test_2d()
|
static void test_2d()
|
||||||
{
|
{
|
||||||
float data1[6];
|
float data1[6];
|
||||||
@ -192,6 +224,7 @@ static void test_array()
|
|||||||
void test_cxx11_tensor_fixed_size()
|
void test_cxx11_tensor_fixed_size()
|
||||||
{
|
{
|
||||||
CALL_SUBTEST(test_1d());
|
CALL_SUBTEST(test_1d());
|
||||||
|
CALL_SUBTEST(test_tensor_map());
|
||||||
CALL_SUBTEST(test_2d());
|
CALL_SUBTEST(test_2d());
|
||||||
CALL_SUBTEST(test_3d());
|
CALL_SUBTEST(test_3d());
|
||||||
CALL_SUBTEST(test_array());
|
CALL_SUBTEST(test_array());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user