fix a numerical instability in Quaternion::slerp
diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index 876524c..97add91 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h
@@ -369,13 +369,14 @@ // 2 - Quaternion slerp(Scalar t, const Quaternion& other) const // which returns the s-lerp between this and other // ?? - if (m_coeffs == other.m_coeffs) + static const Scalar one = Scalar(1) - precision<Scalar>(); + Scalar d = m_coeffs.dot(other.m_coeffs); + Scalar absD = ei_abs(d); + if (d>=one) return *this; - Scalar d = m_coeffs.dot(other.m_coeffs); - // theta is the angle between the 2 quaternions - Scalar theta = std::acos(ei_abs(d)); + Scalar theta = std::acos(absD); Scalar sinTheta = ei_sin(theta); Scalar scale0 = ei_sin( ( Scalar(1) - t ) * theta) / sinTheta;