aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Eigen/src/Core/functors/NullaryFunctors.h2
-rw-r--r--test/nullary.cpp24
2 files changed, 25 insertions, 1 deletions
diff --git a/Eigen/src/Core/functors/NullaryFunctors.h b/Eigen/src/Core/functors/NullaryFunctors.h
index 0311d9035..60c5f7f2a 100644
--- a/Eigen/src/Core/functors/NullaryFunctors.h
+++ b/Eigen/src/Core/functors/NullaryFunctors.h
@@ -93,7 +93,7 @@ struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/true>
linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
m_low(low),
m_multiplier((high-low)/convert_index<Scalar>(num_steps<=1 ? 1 : num_steps-1)),
- m_divisor(convert_index<Scalar>(num_steps+high-low)/(high-low+1)),
+ m_divisor(convert_index<Scalar>(num_steps+high-low)/((high-low+1)==0?1:(high-low+1))),
m_use_divisor((high+1)<(low+num_steps))
{}
diff --git a/test/nullary.cpp b/test/nullary.cpp
index 351d26e74..bb0cea937 100644
--- a/test/nullary.cpp
+++ b/test/nullary.cpp
@@ -152,6 +152,30 @@ void testVectorType(const VectorType& base)
m.tail(size-1).setLinSpaced(low, high);
VERIFY_IS_APPROX(m(size-1), high);
}
+
+ // regression test for bug 1383 (LinSpaced with empty size/range)
+ {
+ Index n0 = VectorType::SizeAtCompileTime==Dynamic ? 0 : VectorType::SizeAtCompileTime;
+ low = internal::random<Scalar>();
+ m = VectorType::LinSpaced(n0,low,low-1);
+ VERIFY(m.size()==n0);
+
+ if(VectorType::SizeAtCompileTime==Dynamic)
+ {
+ VERIFY_IS_EQUAL(VectorType::LinSpaced(n0,0,Scalar(n0-1)).sum(),Scalar(0));
+ VERIFY_IS_EQUAL(VectorType::LinSpaced(n0,low,low-1).sum(),Scalar(0));
+ }
+
+ m.setLinSpaced(n0,0,Scalar(n0-1));
+ VERIFY(m.size()==n0);
+ m.setLinSpaced(n0,low,low-1);
+ VERIFY(m.size()==n0);
+
+ // empty range only:
+ VERIFY_IS_APPROX(VectorType::LinSpaced(size,low,low),VectorType::Constant(size,low));
+ m.setLinSpaced(size,low,low);
+ VERIFY_IS_APPROX(m,VectorType::Constant(size,low));
+ }
}
template<typename MatrixType>