More precise vector length computation

This commit is contained in:
Nikita Lisitsa 2020-11-05 16:41:02 +03:00
parent e9b408ef77
commit 1bebfebb6d

View file

@ -201,10 +201,21 @@ namespace psemek::geom
return dot(v, v);
}
template <typename T, std::size_t N>
T linf_norm(vector<T, N> const & v)
{
T r = std::abs(v[0]);
for (std::size_t i = 1; i < N; ++i)
r = std::max(r, std::abs(v[i]));
return r;
}
template <typename T, std::size_t N>
T length(vector<T, N> const & v)
{
return std::sqrt(length_sqr(v));
T const m = linf_norm(v);
if (m == 0) return m;
return m * std::sqrt(length_sqr(v / m));
}
template <typename T, std::size_t N>