More precise vector length computation
This commit is contained in:
parent
e9b408ef77
commit
1bebfebb6d
1 changed files with 12 additions and 1 deletions
|
|
@ -201,10 +201,21 @@ namespace psemek::geom
|
||||||
return dot(v, v);
|
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>
|
template <typename T, std::size_t N>
|
||||||
T length(vector<T, N> const & v)
|
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>
|
template <typename T, std::size_t N>
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue